骨传导移植
authorliangzhenying <867174124@qq.com>
Fri, 26 Dec 2025 03:39:24 +0000 (11:39 +0800)
committerliangzhenying <867174124@qq.com>
Fri, 26 Dec 2025 03:39:24 +0000 (11:39 +0800)
48 files changed:
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleManager.swift
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DeepChordsAiSdk.swift
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/BleManager.swift
ShenYin/ShenYin/Cache/AiLanguageCache.swift
ShenYin/ShenYin/Cache/RecordDetailModel.swift
ShenYin/ShenYin/Cache/UserModel.swift
ShenYin/ShenYin/Sdk/CCAiSupportLanguage.swift [moved from ShenYin/ShenYin/JoySdk/AiSupportLanguage.swift with 95% similarity]
ShenYin/ShenYin/Sdk/CCBleManager.swift [moved from ShenYin/ShenYin/JoySdk/JoyBleManager.swift with 87% similarity]
ShenYin/ShenYin/Sdk/CCDevice.swift [moved from ShenYin/ShenYin/JoySdk/JoyDevice.swift with 94% similarity]
ShenYin/ShenYin/Sdk/CCRole.swift [new file with mode: 0644]
ShenYin/ShenYin/Sdk/CCSdkManager.swift [new file with mode: 0644]
ShenYin/ShenYin/Sdk/DcSdk/BleManager.swift [moved from ShenYin/ShenYin/DcSdk/BleManager.swift with 100% similarity]
ShenYin/ShenYin/Sdk/DcSdk/DCChatManager.swift [moved from ShenYin/ShenYin/DcSdk/DCChatManager.swift with 100% similarity]
ShenYin/ShenYin/Sdk/DcSdk/DCChatVC.swift [new file with mode: 0644]
ShenYin/ShenYin/Sdk/DcSdk/DCSdkManager.swift [moved from ShenYin/ShenYin/DcSdk/DCSdkManager.swift with 60% similarity]
ShenYin/ShenYin/Sdk/JoySdk/JoyCallRecord.swift [moved from ShenYin/ShenYin/JoySdk/JoyCallRecord.swift with 98% similarity]
ShenYin/ShenYin/Sdk/JoySdk/JoyChat.swift [moved from ShenYin/ShenYin/JoySdk/JoyChat.swift with 100% similarity]
ShenYin/ShenYin/Sdk/JoySdk/JoyDevice.swift [new file with mode: 0644]
ShenYin/ShenYin/Sdk/JoySdk/JoyRecord.swift [moved from ShenYin/ShenYin/JoySdk/JoyRecord.swift with 98% similarity]
ShenYin/ShenYin/Sdk/JoySdk/JoySdkManager.swift [moved from ShenYin/ShenYin/JoySdk/JoySdkManager.swift with 94% similarity]
ShenYin/ShenYin/UI/Home/CallingRecordVC.swift
ShenYin/ShenYin/UI/Home/Device/HomeDeviceCell.swift
ShenYin/ShenYin/UI/Home/Device/HomeDeviceVC.swift
ShenYin/ShenYin/UI/Home/Dialog/DialogRecordBar.swift
ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordBar.swift
ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingVC.swift
ShenYin/ShenYin/UI/Home/FieldRecording/RecordBar.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/VC/RecordShareVC.swift
ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift
ShenYin/ShenYin/UI/Home/Root/CurrentDeviceView.swift
ShenYin/ShenYin/UI/Home/Root/HomeFunctionView.swift
ShenYin/ShenYin/UI/Home/Root/HomeHeadView.swift
ShenYin/ShenYin/UI/Home/Scan/BleScanVC.swift
ShenYin/ShenYin/UI/Home/Scan/DeviceVM.swift
ShenYin/ShenYin/UI/Home/StereoCallVC.swift
ShenYin/ShenYin/UI/Mine/Device/DeviceInfoVC.swift
ShenYin/ShenYin/UI/Mine/Feedback/FeedbackBottomView.swift
ShenYin/ShenYin/UI/Mine/Update/BleUpdateVM.swift
ShenYin/ShenYin/UI/Mine/Update/UpdateVC.swift
ShenYin/ShenYin/UI/Mode/CustomEqVC.swift
ShenYin/ShenYin/UI/Mode/FindVC.swift
ShenYin/ShenYin/UI/Mode/ModeEffectsView.swift
ShenYin/ShenYin/UI/Mode/ModeVC.swift
ShenYin/ShenYin/UI/common/pop/ConnectPopView.swift
ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerTitle.swift
ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerView.swift
ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguageSelectItem.swift
document/20251226-095425.jpg [new file with mode: 0644]

index 38635fd..15b9722 100644 (file)
@@ -40,7 +40,7 @@ public class DCBleManager{
         full.append(data)
         full.addCrc()
         if let connectPeripheral = connectPeripheral, let writeCha = writeCha {
-            DCLogger.debug("发",writeCha.uuid.uuidString,full.joined())
+//            DCLogger.debug("发",writeCha.uuid.uuidString,full.joined())
             connectPeripheral.writeValue(full, for: writeCha, type:.withoutResponse)
         }
     }
@@ -85,7 +85,7 @@ public extension DCBleManager{
     }
     
     func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
-        DCLogger.debug("收 ",characteristic.uuid,characteristic.value?.joined() ?? "")
+//        DCLogger.debug("收 ",characteristic.uuid,characteristic.value?.joined() ?? "")
         guard let data = characteristic.value else { return  }
         if data.count > 4 && data[0] == 0xBA {
             if let sender = BleSender.answer(data) {
index 6c9509c..e843021 100644 (file)
@@ -18,7 +18,7 @@ public class DeepChordsAiSdk{
 
         StarburstConfig.shared().switch(to: .ble)
         StarburstConfig.shared().appId = "prjzVnOEpKL1N"
-        StarburstConfig.shared().isDebug = true
+        StarburstConfig.shared().isDebug = false
         //MARK: 配置缓存路径
         StarburstConfig.shared().sdkFolder = NSTemporaryDirectory()
 //        StarburstConfig.shared().sdkFolder = NSHomeDirectory() + "/Documents/DeepChordsSdk"
index 16fa09a..433442e 100644 (file)
@@ -5,13 +5,6 @@
 //  Created by liangshi on 2025/11/24.
 //
 
-//
-//  Untitled.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/8/28.
-//
-
 import UIKit
 import CoreBluetooth
 import DeepChordsSdk
@@ -117,7 +110,11 @@ extension BleManager:CBCentralManagerDelegate{
 
 extension BleManager: CBPeripheralDelegate {
     func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
-        DCBleManager.shared.peripheral(peripheral, didDiscoverServices: error)
+//        DCBleManager.shared.peripheral(peripheral, didDiscoverServices: error)
+        for service in peripheral.services! {
+            DCLogger.debug("peripheral service: %@", service)
+            peripheral.discoverCharacteristics(nil, for: service)
+        }
     }
     
     func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
index 1072be0..02b0ae2 100644 (file)
@@ -17,13 +17,13 @@ enum AiLanguageCacheType:String{
 }
 
 class AiLanguageCache{
-    static func save(type:AiLanguageCacheType, lan:AiSupportLanguage){
+    static func save(type:AiLanguageCacheType, lan:CCAiLanguage){
         UserDefaults.standard.set(lan.rawValue, forKey: type.rawValue)
         UserDefaults.standard.synchronize()
     }
-    static func get(type:AiLanguageCacheType)->AiSupportLanguage?{
+    static func get(type:AiLanguageCacheType)->CCAiLanguage?{
         if let value = UserDefaults.standard.value(forKey: type.rawValue),let text = value as? String {
-            return AiSupportLanguage(rawValue: text)
+            return CCAiLanguage(rawValue: text)
         }
         return nil
     }
index b1cdcd7..5c1e182 100644 (file)
@@ -68,8 +68,8 @@ class RecordDetailModel:NSObject, NSCoding{
     }
     
     required init?(coder: NSCoder) {
-        from = AiSupportLanguage(rawValue: coder.decodeObject(forKey: "from") as! String) ?? .chinse
-        to = AiSupportLanguage(rawValue: coder.decodeObject(forKey: "to") as! String) ?? .english
+        from = CCAiLanguage(rawValue: coder.decodeObject(forKey: "from") as! String) ?? .chinse
+        to = CCAiLanguage(rawValue: coder.decodeObject(forKey: "to") as! String) ?? .english
         type = RecordType(rawValue: coder.decodeObject(forKey: "type") as! String) ?? .present
         origin = coder.decodeObject(forKey: "origin") as? String ?? ""
         translate = coder.decodeObject(forKey: "translate") as? String ?? ""
@@ -81,8 +81,8 @@ class RecordDetailModel:NSObject, NSCoding{
         favorite = coder.decodeObject(forKey: "favorite") as? String ?? ""
     }
     var type:RecordType = .present
-    var from:AiSupportLanguage = .chinse
-    var to:AiSupportLanguage = .english
+    var from:CCAiLanguage = .chinse
+    var to:CCAiLanguage = .english
     var path = ""
     var name = ""
     var duration = 0
index 34a5ac3..72b217c 100644 (file)
@@ -41,7 +41,7 @@ extension UserModel{
         self.token = nil
         self.info = UserInfo()
         UserCache.shared.remove()
-        JoyBleManager.shared.cancel()
+        CCBleManager.shared.cancel()
         NotificationManager.post(type: .logout, objtect: nil)
         App.shared.goToLogin()
     }
@@ -8,7 +8,7 @@
 import Foundation
 import JoyGemAI
 
-enum AiSupportLanguage:String{
+enum CCAiLanguage:String{
     case chinse = "chinse"
     case english = "english"
     case japanese = "japanese"
@@ -25,10 +25,10 @@ enum AiSupportLanguage:String{
     case Arabic = "Arabic"
     case Vietnam = "Vietnam"
 
-    static var chinse2english:[AiSupportLanguage]{
+    static var chinse2english:[CCAiLanguage]{
         return [.chinse,.english]
     }
-    static var translate:[AiSupportLanguage]{
+    static var translate:[CCAiLanguage]{
         return [.chinse,.english,.japanese,.korean,.french,.spanish,.portuguese,.indonesian,.russian,.malay,German,Filipino,thai,Arabic,Vietnam]
     }
     var title:String{
similarity index 87%
rename from ShenYin/ShenYin/JoySdk/JoyBleManager.swift
rename to ShenYin/ShenYin/Sdk/CCBleManager.swift
index c9b1317..4e13a15 100644 (file)
@@ -1,8 +1,8 @@
 //
-//  Untitled.swift
+//  CCBleManager.swift
 //  ShenYin
 //
-//  Created by liangshi on 2025/8/28.
+//  Created by liangshi on 2025/12/25.
 //
 
 import UIKit
@@ -23,7 +23,7 @@ class DCPeripheral{
     }
 }
 
-class JoyBleManager: NSObject {
+class CCBleManager: NSObject {
     var discoverDeviceCallback: (([DCPeripheral]) -> Void)?
     var didConnectDeviceCallback: ((DCPeripheral) -> Void)?
     var conetedFailureCallback: ((DCPeripheral) -> Void)?
@@ -31,7 +31,7 @@ class JoyBleManager: NSObject {
     private var centralManager: CBCentralManager!
     var devices: [DCPeripheral] = []
     var connectPeripheral: DCPeripheral?
-    static let shared = JoyBleManager()
+    static let shared = CCBleManager()
     var isConnetd:Bool = false
     
     private override init() {
@@ -39,7 +39,7 @@ class JoyBleManager: NSObject {
         centralManager = CBCentralManager(delegate: self, queue: nil)
     }
 }
-extension JoyBleManager:CBCentralManagerDelegate{
+extension CCBleManager:CBCentralManagerDelegate{
     func centralManagerDidUpdateState(_ central: CBCentralManager) {
         Logger.debug("蓝牙状态",central.state.rawValue)
         switch central.state {
@@ -56,7 +56,7 @@ extension JoyBleManager:CBCentralManagerDelegate{
             NotificationManager.post(type: .deviceValidChange, objtect: nil)
             break
         case.poweredOn:
-//            startScanDevice()
+            //            startScanDevice()
             checkConectState()
             break
         @unknown default:
@@ -111,14 +111,13 @@ extension JoyBleManager:CBCentralManagerDelegate{
     }
 }
 
-extension JoyBleManager: CBPeripheralDelegate {
+extension CCBleManager: CBPeripheralDelegate {
     func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
         Logger.debug("发现服务成功")
         for service in peripheral.services! {
             Logger.debug("peripheral service: %@", service)
             peripheral.discoverCharacteristics(nil, for: service)
         }
-        
     }
     
     func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
@@ -148,7 +147,7 @@ extension JoyBleManager: CBPeripheralDelegate {
     }
     
     func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
-//        Logger.debug("收到数据 ===uUId ",characteristic.uuid)
+        //        Logger.debug("收到数据 ===uUId ",characteristic.uuid)
         if App.shared.isJoy {
             if OtaMananger.isOtadata(characteristic){
                 if let _ = characteristic.value,error == nil {
@@ -177,19 +176,19 @@ extension JoyBleManager: CBPeripheralDelegate {
     }
 }
 
-extension JoyBleManager{
+extension CCBleManager{
     func startScanDevice() {
-//        centralManager.stopScan()
+        //        centralManager.stopScan()
         Logger.debug("扫描中...")
         Logger.debug("蓝牙状态",centralManager.state.rawValue)
         devices = []
-//        let list = centralManager.retrieveConnectedPeripherals(withServices: [CBUUID(string: kJoyGemAIServiceUUID)])
-//        Logger.debug("已连接设备",list)
-//        for item in list {
-//            if let mac = DeviceCache.shared.getMac(item.identifier.uuidString){
-//                devices.append(DCPeripheral(device: item,mac: mac))
-//            }
-//        }
+        //        let list = centralManager.retrieveConnectedPeripherals(withServices: [CBUUID(string: kJoyGemAIServiceUUID)])
+        //        Logger.debug("已连接设备",list)
+        //        for item in list {
+        //            if let mac = DeviceCache.shared.getMac(item.identifier.uuidString){
+        //                devices.append(DCPeripheral(device: item,mac: mac))
+        //            }
+        //        }
         if App.shared.isJoy {
             centralManager.scanForPeripherals(withServices: [CBUUID(string: JoySdkManager.serviceUUID)],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false])
         }
@@ -226,7 +225,7 @@ extension JoyBleManager{
     }
 }
 
-extension JoyBleManager{
+extension CCBleManager{
     func joySdkSend(_ data: Data, with characteristic: CBCharacteristic) {
         if let connectPeripheral = connectPeripheral{
             connectPeripheral.device.writeValue(data, for: characteristic, type:.withoutResponse)
@@ -234,7 +233,7 @@ extension JoyBleManager{
     }
 }
 
-extension JoyBleManager{
+extension CCBleManager{
     func isConected(mac:String)->Bool{
         guard let device = connectPeripheral else { return false }
         if device.mac == mac {
@@ -245,29 +244,29 @@ extension JoyBleManager{
         }
     }
     
-//    #连接有问题,应当获取设置里面已连接的设备
+    //    #连接有问题,应当获取设置里面已连接的设备
     func connect(mac:String, finished:@escaping ((Bool) -> Void)){
-        JoyBleManager.shared.cancel()
-        JoyBleManager.shared.discoverDeviceCallback = { list in
+        CCBleManager.shared.cancel()
+        CCBleManager.shared.discoverDeviceCallback = { list in
             if list.count <= 0 {
                 return
             }
             for item in list {
                 if item.mac == mac {
-                    JoyBleManager.shared.connectPeripheral(item)
+                    CCBleManager.shared.connectPeripheral(item)
                     break
                 }
             }
         }
-        JoyBleManager.shared.didConnectDeviceCallback = { device in
+        CCBleManager.shared.didConnectDeviceCallback = { device in
             finished(true)
         }
-        JoyBleManager.shared.conetedFailureCallback = {  device in
+        CCBleManager.shared.conetedFailureCallback = {  device in
             finished(false)
         }
-        JoyBleManager.shared.startScanDevice()
+        CCBleManager.shared.startScanDevice()
     }
-
+    
     func checkSettingsConnected()->[CBPeripheral]{
         let list = centralManager.retrieveConnectedPeripherals(withServices: [CBUUID(string: JoySdkManager.serviceUUID)])
         Logger.debug("已连接设备",list)
@@ -275,7 +274,7 @@ extension JoyBleManager{
     }
 }
 
-extension JoyBleManager{
+extension CCBleManager{
     func checkConectState(){
         guard let mac = connectPeripheral?.mac else {
             return
similarity index 94%
rename from ShenYin/ShenYin/JoySdk/JoyDevice.swift
rename to ShenYin/ShenYin/Sdk/CCDevice.swift
index 6e18539..39d1d46 100644 (file)
@@ -1,8 +1,8 @@
 //
-//  JoyDevice.swift
+//  Device.swift
 //  ShenYin
 //
-//  Created by liangshi on 2025/12/5.
+//  Created by liangshi on 2025/12/25.
 //
 import JoyGemAI
 
@@ -87,7 +87,7 @@ enum FindType:Int{
     }
 }
 
-class JoyDevice{
+class CCDevice{
     static func findHeadphone(_ mode:FindType){
         JoyGemAIManager.shared().device.findHeadphone(mode.value) { err in
             Logger.debug("findHeadphone:\(err)");
@@ -129,7 +129,7 @@ class JoyDevice{
         }
     }
 }
-extension JoyDevice{
+extension CCDevice{
     static func getMac(finished:@escaping ((_ mac:String?)->Void)) {
         JoyGemAIManager.shared().device.macAddress { edr, ble in
             Logger.debug("edr:\(edr),ble:\(ble)");
@@ -140,10 +140,6 @@ extension JoyDevice{
         }
     }
     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
diff --git a/ShenYin/ShenYin/Sdk/CCRole.swift b/ShenYin/ShenYin/Sdk/CCRole.swift
new file mode 100644 (file)
index 0000000..953f1b9
--- /dev/null
@@ -0,0 +1,17 @@
+//
+//  CCRole.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/12/26.
+//
+
+public class CCRole{
+    /// 音色id
+    public var sid:String = ""
+    /// 名称
+    public var name:String = ""
+    /// 类型
+    public var type:String = ""
+    /// 角色
+    public var role:String = ""
+}
diff --git a/ShenYin/ShenYin/Sdk/CCSdkManager.swift b/ShenYin/ShenYin/Sdk/CCSdkManager.swift
new file mode 100644 (file)
index 0000000..fe99743
--- /dev/null
@@ -0,0 +1,12 @@
+//
+//  CCSdkManager.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/12/25.
+//
+
+class CCSdkManager {
+    
+    
+    
+}
diff --git a/ShenYin/ShenYin/Sdk/DcSdk/DCChatVC.swift b/ShenYin/ShenYin/Sdk/DcSdk/DCChatVC.swift
new file mode 100644 (file)
index 0000000..51d58a7
--- /dev/null
@@ -0,0 +1,218 @@
+////
+////  DCChatVC.swift
+////  ShenYin
+////
+////  Created by liangshi on 2025/12/26.
+////
+//
+//import UIKit
+//import AVFAudio
+//import DeepChordsSdk
+//class DCChatVC:BaseVC{
+//    let rightItem = ChatNavigationBarItem(frame: CGRect(x: 0, y: 0, width: 80, height: 44))
+//    let roleItem = ChatRoleItem(frame: CGRect(x: 0, y: 0, width: 100, height: 44))
+//    
+//    let toolBar = ChatRecordBar()
+//    let tableView = UITableView(frame: CGRectZero, style: .plain)
+//    let headerView = ChatHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWid, height: 260))
+//    let tipsLabel = UILabel()
+//    
+//    var roleList:[DCRole] = []
+//    
+//    deinit {
+//        PcmSound.sharedInstance().stopAudioUnit()
+//        PcmSound.sharedInstance().cleanup()
+//    }
+//    
+//    override func viewDidLoad() {
+//        super.viewDidLoad()
+//    }
+//    override func setupViews() {
+//        
+//        navBar.rightView.isHidden = true
+//        navBar.addSubviews([roleItem,rightItem])
+//        roleItem.yc.addTap(target: self, action: #selector(roleBtnAction))
+//        rightItem.yc.addTap(target: self, action: #selector(rightBtnAction))
+//        
+//        tableView.backgroundColor = .clear
+//        tableView.delegate = self
+//        tableView.dataSource = self
+//        tableView.estimatedRowHeight = 60
+//        tableView.separatorStyle = .none
+//        tableView.register(ChatCell.self, forCellReuseIdentifier: ChatCell.reuseID)
+//        tableView.tableHeaderView = headerView
+//        
+//        view.addSubviews([tableView,toolBar,tipsLabel])
+//        toolBar.delegate = self
+//        
+//        tipsLabel.do { v in
+//            v.text = "内容由AI生成,请仔细甄别".l10n
+//            v.font = .regular(10)
+//            v.textColor = .hexString("#919191")
+//        }
+//    }
+//    override func setupLayout() {
+//        rightItem.snp.makeConstraints { (m) in
+//            m.top.equalTo(kNavTop)
+//            m.bottom.equalToSuperview()
+//            m.width.greaterThanOrEqualTo(80)
+//            m.right.equalToSuperview()
+//        }
+//        roleItem.snp.makeConstraints { (m) in
+//            m.top.equalTo(kNavTop)
+//            m.bottom.equalToSuperview()
+//            m.width.greaterThanOrEqualTo(80)
+//            m.left.equalToSuperview().inset(48)
+//        }
+//        toolBar.snp.makeConstraints { make in
+//            make.width.centerX.equalToSuperview()
+//            make.height.equalTo(52)
+//            make.bottom.equalToSuperview().inset(35)
+//        }
+//        tipsLabel.snp.makeConstraints { make in
+//            make.top.equalTo(toolBar.snp.bottom).offset(4)
+//            make.centerX.equalToSuperview()
+//        }
+//        tableView.snp.makeConstraints { make in
+//            make.top.equalToSuperview().inset(kNavBtm)
+//            make.left.right.equalToSuperview()
+//            make.bottom.equalTo(toolBar.snp.top)
+//        }
+//    }
+//    override func setupData() {
+//        DCChatManager.shared.chatNeedReloadData = {[weak self]  in
+//            guard let self = self else{return}
+//            tableView.reloadData()
+//            if DCChatManager.shared.dataList.count > 0 {
+//                tableView.scrollToRow(at: IndexPath(row: DCChatManager.shared.dataList.count - 1, section: 0), at: .none, animated: true)
+//            }
+//        }
+//        DCChatManager.shared.codeCallback = { [weak self] code in
+//            guard let self = self else{return}
+//            if code == 20001 {
+//                toolBar.recordBtn.state = .start
+//            }
+//            else if code == 20002 || code == 20003{
+//                toolBar.recordBtn.state = .finish
+//            }
+//            
+//        }
+//        DCChatManager.shared.finishCallback = { [weak self] path in
+//            guard let self = self else{return}
+//            //            self.recordBtn.isSelected = false
+//        }
+//
+//        
+//        refreshData()
+//        loadRoleList()
+//    }
+//    override func viewWillDisappear(_ animated: Bool) {
+//        super.viewWillDisappear(animated)
+//        
+//        ///结束对话,但并不会终止正在播放的录音
+//        DCChatManager.shared.stopChat()
+//        
+//    }
+//    override func viewDidAppear(_ animated: Bool) {
+//        super.viewDidAppear(animated)
+//        refreshData()
+//    }
+//    override func viewDidDisappear(_ animated: Bool) {
+//        super.viewDidDisappear(animated)
+//        ChatCache.shared.saveList(JoySdkManager.shared.chat.dataList)
+//    }
+//
+//    @objc func rightBtnAction() {
+//        App.shared.goToPage(IntelligentVC())
+//    }
+//    @objc func roleBtnAction(){
+//        if roleList.count == 0 {
+//            loadRoleList()
+//            return
+//        }
+//        let vc = RoleListVC(list: roleList, selectedModel: roleItem.role) {[weak self] model in
+//            guard let self = self else{return}
+//            roleItem.role = model
+//            headerView.update(name: model.name, role: model.role)
+//            JoyGemChatManager.shared().setSpeaker(model)
+//        }
+//        App.shared.goToPage(vc)
+//    }
+//    func refreshData(){
+//        tableView.reloadData()
+//        if JoySdkManager.shared.chat.dataList.count > 0 {
+//            tableView.scrollToRow(at: IndexPath(row: JoySdkManager.shared.chat.dataList.count - 1, section: 0), at: .none, animated: true)
+//        }
+//    }
+//    func loadRoleList(){
+//        DCChatManager.shared.getVcSpeekerList {[weak self] speakers in
+//            guard let self = self,speakers.count > 0 else{return}
+//            self.roleList = speakers
+//            self.roleList.insert(xiaoYinRole(), at: 0)
+//            
+//            var currentRole = roleList.first
+//            if let cacheRole = RoleCache.get(){
+//                for item in roleList{
+//                    if item.role == cacheRole {
+//                        currentRole = item
+//                        break
+//                    }
+//                }
+//            }
+//            self.roleItem.role = currentRole
+//            self.headerView.update(name: self.roleItem.role.name, role: self.roleItem.role.role)
+//            JoyGemChatManager.shared().setSpeaker(self.roleItem.role)
+//        }
+//    }
+//    func xiaoYinRole()->JoyGemSpeaker{
+//        let model = JoyGemSpeaker()
+//        model.sid = "zh_female_tianmeitaozi_mars_bigtts"
+//        model.name = "小音"
+//        model.type = "default"
+//        model.role = "test_xiaoyin"
+//        return model
+//    }
+//}
+//
+//extension DCChatVC:ChatRecordBarDelegate{
+//    func recordBarCancel(_ toolBar: ChatRecordBar) {
+//        //        JoyGemChatManager.shared().stopChat()
+//        JoyGemChatManager.shared().stopSingleChat()
+//        if let item = JoySdkManager.shared.chat.dataList.last,item.content.isEmpty{
+//            JoySdkManager.shared.chat.dataList.removeLast()
+//            refreshData()
+//        }
+//    }
+//    
+//    func recordBarStart(_ toolBar: ChatRecordBar) {
+//        //        let model = ChatCellModel()
+//        //        model.type = 1
+//        //        model.content = ""
+//        //        model.id = -1
+//        //        JoySdkManager.shared.dataList.append(model)
+//        //        refreshData()
+//        
+//        //        JoyGemChatManager.shared().stopChat()
+//        JoyGemChatManager.shared().startSingleChat()
+//        DCChatManager.shared.startChat()
+//    }
+//    
+//    func recordBarStop(_ toolBar: ChatRecordBar) {
+//        JoyGemChatManager.shared().stopSingleChat()
+//    }
+//}
+//
+//extension DCChatVC:UITableViewDelegate,UITableViewDataSource {
+//    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+//        return JoySdkManager.shared.chat.dataList.count
+//    }
+//    
+//    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+//        let cell = ChatCell.cell(withTableView: tableView, indexPath: indexPath)
+//        cell.data = JoySdkManager.shared.chat.dataList[indexPath.row]
+//        return cell
+//    }
+//    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+//        
+//    }
+//}
similarity index 60%
rename from ShenYin/ShenYin/DcSdk/DCSdkManager.swift
rename to ShenYin/ShenYin/Sdk/DcSdk/DCSdkManager.swift
index 71d1d0f..0ca4e8a 100644 (file)
@@ -8,21 +8,32 @@ import DeepChordsSdk
 
 class DCSdkManager{
     static let shared = DCSdkManager()
+    public var authCallback:((_ success:Bool)->Void)?
     
     
     func initSdk(){
         DeepChordsAiSdk.shared.initSDK()
+        DeepChordsAiSdk.shared.authCallback = {[weak self] (code,msg)in
+            DCLogger.debug(code,msg)
+            guard let self = self else{return}
+            if code == 200{
+                joyGemAuthSuccessCallback()
+            }
+            else{
+                joyGemAuthFailedCallback()
+            }
+        }
 //        DCRecordManager.shared.setupRecord()
         DCChatManager.shared.setupChat()
         
         DCDevice.shared.eventCallback = { event in
             switch event {
             case 0x01:
-//                if let vc = App.shared.topVC() as? ChatVC {
-//                    //                    vc.startRecord()
-//                }else{
-//                    App.shared.goToPage(ChatVC())
-//                }
+                if let vc = App.shared.topVC() as? ChatVC {
+                    //                    vc.startRecord()
+                }else{
+                    App.shared.goToPage(ChatVC())
+                }
                 break
             case 0x02:
 //                if let vc = App.shared.topVC() as? ChatVC {
@@ -50,6 +61,21 @@ class DCSdkManager{
             }
         }
     }
+    func joyGemAuthFailedCallback() {
+        Logger.debug("鉴权失败")
+        YLprogressHUD.showAutoHiden("鉴权失败")
+    }
+    func joyGemAuthSuccessCallback() {
+        Logger.debug("鉴权成功")
+        App.shared.preparePlay()
+        
+        DeviceCache.saveLastConnected(mac: CCBleManager.shared.connectPeripheral!.mac)
+        DeviceCache.shared.add(CCBleManager.shared.connectPeripheral!.device.identifier.uuidString, mac: CCBleManager.shared.connectPeripheral!.mac)
+        CCBleManager.shared.isConnetd = true
+        CCBleManager.shared.didConnectDeviceCallback?(CCBleManager.shared.connectPeripheral!)
+        NotificationManager.post(type: .deviceValidChange, objtect: nil)
+        DeviceVM.updateOtaVersion()
+    }
 }
 extension DCSdkManager{
     static func getMac(_ dict:[String:Any])->String?{
similarity index 98%
rename from ShenYin/ShenYin/JoySdk/JoyCallRecord.swift
rename to ShenYin/ShenYin/Sdk/JoySdk/JoyCallRecord.swift
index ed725e5..0838801 100644 (file)
@@ -41,7 +41,7 @@ class JoyCallRecord:NSObject{
     }
 
     
-    func setCallRecoordLanage(_ language:AiSupportLanguage){
+    func setCallRecoordLanage(_ language:CCAiLanguage){
         JoyGemCallManager.shared().originalLanguage = language.value
     }
     func callRecordStart(){
diff --git a/ShenYin/ShenYin/Sdk/JoySdk/JoyDevice.swift b/ShenYin/ShenYin/Sdk/JoySdk/JoyDevice.swift
new file mode 100644 (file)
index 0000000..316c6be
--- /dev/null
@@ -0,0 +1,162 @@
+////
+////  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)
+//        }
+//    }
+//}
similarity index 98%
rename from ShenYin/ShenYin/JoySdk/JoyRecord.swift
rename to ShenYin/ShenYin/Sdk/JoySdk/JoyRecord.swift
index a1f218e..e5e0caa 100644 (file)
@@ -19,7 +19,7 @@ class JoyRecord:NSObject{
         JoyGemRecordManager.shared().delegate = self
     }
     
-    func setRecoordLanage(_ language:AiSupportLanguage){
+    func setRecoordLanage(_ language:CCAiLanguage){
         JoyGemRecordManager.shared().originalLanguage = language.value
     }
     func recordStart(){
similarity index 94%
rename from ShenYin/ShenYin/JoySdk/JoySdkManager.swift
rename to ShenYin/ShenYin/Sdk/JoySdk/JoySdkManager.swift
index edbfc54..4149aa3 100644 (file)
@@ -118,10 +118,10 @@ extension JoySdkManager : JoyGemAIManagerDelegate {
         Logger.debug("鉴权成功")
         App.shared.preparePlay()
         
-        DeviceCache.saveLastConnected(mac: JoyBleManager.shared.connectPeripheral!.mac)
-        DeviceCache.shared.add(JoyBleManager.shared.connectPeripheral!.device.identifier.uuidString, mac: JoyBleManager.shared.connectPeripheral!.mac)
-        JoyBleManager.shared.isConnetd = true
-        JoyBleManager.shared.didConnectDeviceCallback?(JoyBleManager.shared.connectPeripheral!)
+        DeviceCache.saveLastConnected(mac: CCBleManager.shared.connectPeripheral!.mac)
+        DeviceCache.shared.add(CCBleManager.shared.connectPeripheral!.device.identifier.uuidString, mac: CCBleManager.shared.connectPeripheral!.mac)
+        CCBleManager.shared.isConnetd = true
+        CCBleManager.shared.didConnectDeviceCallback?(CCBleManager.shared.connectPeripheral!)
         NotificationManager.post(type: .deviceValidChange, objtect: nil)
         DeviceVM.updateOtaVersion()
     }
@@ -187,7 +187,7 @@ extension JoySdkManager : JoyGemAIManagerDelegate {
 extension JoySdkManager : JoyGemAIManagerDataSource {
     func joyGemSend(_ data: Data, with characteristic: CBCharacteristic) {
         //        print("发送",data.map { String($0) }.joined(separator: ""))
-        JoyBleManager.shared.joySdkSend(data, with: characteristic)
+        CCBleManager.shared.joySdkSend(data, with: characteristic)
     }
 }
 
index 2c4c69a..9f92411 100644 (file)
@@ -152,7 +152,7 @@ class CallingRecordVC:BaseVC{
 }
 
 extension CallingRecordVC:FieldRecordBarDelegate{
-    func fieldRecordBar(_ bar: FieldRecordBar, languageChange language: AiSupportLanguage) {
+    func fieldRecordBar(_ bar: FieldRecordBar, languageChange language: CCAiLanguage) {
         JoySdkManager.shared.callRecord.setCallRecoordLanage(language)
         AiLanguageCache.save(type: .thly, lan: language)
     }
index aec110b..72b72d5 100644 (file)
@@ -20,7 +20,7 @@ class HomeDeviceCell: BaseCollectionViewCell {
 
             icon.kf.setImage(with: model.image.yc.asUrl)
             
-            if JoyBleManager.shared.isConected(mac: model.mac) {
+            if CCBleManager.shared.isConected(mac: model.mac) {
                 valueLabel.text =  "已连接".l10n
                 bgView.alpha = 1
             }
index 5e1166f..9e9fd95 100644 (file)
@@ -87,7 +87,7 @@ class HomeDeviceVC:BaseVC{
      func reloadData() {
         DeviceVM.shared.refresh {[weak self] result in
             self?.collectionView.reloadData()
-            if JoyBleManager.shared.isConnetd{
+            if CCBleManager.shared.isConnetd{
                 return
             }
             var  autoConnetced = false
@@ -110,7 +110,7 @@ class HomeDeviceVC:BaseVC{
     override func navRightViewTapped() {
         App.shared.goToPage(BleScanVC())
 //        App.shared.goToPage(CalendarPickerVC())
-//        JoyBleManager.shared.checkSettingsConnected()
+//        CCBleManager.shared.checkSettingsConnected()
 //        ChatCache.shared.LargeDateDemoSave()
     }
     @objc func editAction(){
@@ -134,12 +134,12 @@ class HomeDeviceVC:BaseVC{
             guard let self = self else {return}
             if model.isSuccess{
                 YLprogressHUD.hidden()
-                if let mac0 = JoyBleManager.shared.connectPeripheral?.mac,let mac1 = DeviceCache.getLastConnected(),mac0 == mac1{
+                if let mac0 = CCBleManager.shared.connectPeripheral?.mac,let mac1 = DeviceCache.getLastConnected(),mac0 == mac1{
                     DeviceCache.remove()
                 }
                 DeviceVM.shared.dataList.removeAll(where: {$0.deviceId == deviceModel.deviceId})
                 collectionView.reloadData()
-                JoyBleManager.shared.cancel()
+                CCBleManager.shared.cancel()
                 reloadData()
             }
             else{
@@ -148,7 +148,7 @@ class HomeDeviceVC:BaseVC{
         }
     }
     func startConectBle(_ model:HomeDeviceModel){
-        JoyBleManager.shared.connect(mac: model.mac) { result in
+        CCBleManager.shared.connect(mac: model.mac) { result in
         }
     }
     @objc func deviceChange(_ noti:Notification){
index a91be95..e88f28c 100644 (file)
@@ -154,7 +154,7 @@ class DialogRecordBar: BaseView {
         if recordView.isBusy {
             return
         }
-        let v = LanguagePickerView(languages: AiSupportLanguage.translate,isLeft: true,left: languageView.leftItem.language,right: languageView.rightItem.language)
+        let v = LanguagePickerView(languages: CCAiLanguage.translate,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: AiSupportLanguage.translate,isLeft: false,left: languageView.leftItem.language,right: languageView.rightItem.language)
+        let v = LanguagePickerView(languages: CCAiLanguage.translate,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
@@ -268,13 +268,13 @@ class DialogRecordBar: BaseView {
             addSubviews([leftItem,rightItem])
 
             leftItem.do { (v) in
-                v.language = AiSupportLanguage.chinse
+                v.language = CCAiLanguage.chinse
                 v.yc.addTap(target: self, action: #selector(leftLanguageAction))
                 v.language = .chinse
                 v.valueLabel.text = "耳机".l10n
             }
             rightItem.do { (v) in
-                v.language = AiSupportLanguage.english
+                v.language = CCAiLanguage.english
                 v.yc.addTap(target: self, action: #selector(rightLanguageAction))
                 v.language = .english
                 v.valueLabel.text = "手机".l10n
@@ -299,7 +299,7 @@ class DialogRecordBar: BaseView {
         let titleLabel = UILabel()
         let valueLabel = UILabel()
         
-        var language:AiSupportLanguage = AiSupportLanguage.chinse{
+        var language:CCAiLanguage = CCAiLanguage.chinse{
             didSet{
                 titleLabel.text = language.title
             }
index 9869983..9dbae62 100644 (file)
@@ -13,7 +13,7 @@ enum RecordSate:Int{
 }
 
 protocol FieldRecordBarDelegate:NSObject {
-    func fieldRecordBar(_ bar:FieldRecordBar,languageChange language:AiSupportLanguage)
+    func fieldRecordBar(_ bar:FieldRecordBar,languageChange language:CCAiLanguage)
     func fieldRecordBar(_ bar:FieldRecordBar,stateChange state:RecordSate)
 }
 
@@ -73,14 +73,14 @@ class FieldRecordBar: BaseView {
         if recordBtn.isSelected || recordBtn.activeView.animating {
             return
         }
-        let list = AiSupportLanguage.translate.map{$0.title}
+        let list = CCAiLanguage.translate.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 = AiSupportLanguage.translate.first(where: {$0.title == value})!
+            leftItem.language = CCAiLanguage.translate.first(where: {$0.title == value})!
             delegate?.fieldRecordBar(self, languageChange:leftItem.language)
         }
         return
@@ -126,7 +126,7 @@ class FieldRecordBar: BaseView {
     class RecordBarItem: BaseView {
         private let icon = UIImageView()
         private let titleLabel = UILabel()
-        var language:AiSupportLanguage = .chinse{
+        var language:CCAiLanguage = .chinse{
             didSet{
                 titleLabel.text = language.title
             }
index 2c8d63b..2a41fb7 100644 (file)
@@ -134,7 +134,7 @@ class FieldRecordingVC:BaseVC{
 }
 
 extension FieldRecordingVC:FieldRecordBarDelegate{
-    func fieldRecordBar(_ bar: FieldRecordBar, languageChange language: AiSupportLanguage) {
+    func fieldRecordBar(_ bar: FieldRecordBar, languageChange language: CCAiLanguage) {
         JoySdkManager.shared.record.setRecoordLanage(language)
         AiLanguageCache.save(type: .xcly, lan: language)
     }
index 36c832d..799ec62 100644 (file)
@@ -43,12 +43,12 @@ class RecordBar: BaseView {
             v.addTarget(self, action: #selector(recordBtnAction), for: .touchUpInside)
         }
         leftItem.do { (v) in
-            v.language = AiSupportLanguage.chinse
+            v.language = CCAiLanguage.chinse
             v.yc.addTap(target: self, action: #selector(leftAction))
         }
         rightItem.do { (v) in
             
-            v.language = AiSupportLanguage.english
+            v.language = CCAiLanguage.english
             v.yc.addTap(target: self, action: #selector(rightAction))
         }
     }
@@ -111,7 +111,7 @@ class RecordBar: BaseView {
         if recordBtn.isSelected {
             return
         }
-        let v = LanguagePickerView(languages: AiSupportLanguage.translate,isLeft: true,left: leftItem.language,right: rightItem.language)
+        let v = LanguagePickerView(languages: CCAiLanguage.translate,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: AiSupportLanguage.translate,isLeft: false,left: leftItem.language,right: rightItem.language)
+        let v = LanguagePickerView(languages: CCAiLanguage.translate,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
@@ -155,7 +155,7 @@ class RecordBar: BaseView {
         let titleLabel = UILabel()
         let valueLabel = UILabel()
         
-        var language:AiSupportLanguage = AiSupportLanguage.chinse{
+        var language:CCAiLanguage = CCAiLanguage.chinse{
             didSet{
                 titleLabel.text = language.title
             }
index cd43b28..c950855 100644 (file)
@@ -169,8 +169,8 @@ extension RecordShareVC{
             if result.isSuccess,let model = result.data.list.first{
                 localModel.origin = model.text
                 localModel.translate = model.translateText
-                localModel.from = AiSupportLanguage(rawValue: model.sourceLanguage) ?? .chinse
-                localModel.to = AiSupportLanguage(rawValue: model.targetLanguage) ?? .english
+                localModel.from = CCAiLanguage(rawValue: model.sourceLanguage) ?? .chinse
+                localModel.to = CCAiLanguage(rawValue: model.targetLanguage) ?? .english
                 
                 self?.getRecordPath(filedId: remoteModel.fileId) {  result in
                     if let path = result{
index 86c1d1b..bcbafaa 100644 (file)
@@ -272,8 +272,8 @@ class RecordDetailVC:BaseVC{
               
                 localModel.origin = model.text
                 localModel.translate = model.translateText
-                localModel.from = AiSupportLanguage(rawValue: model.sourceLanguage) ?? .chinse
-                localModel.to = AiSupportLanguage(rawValue: model.targetLanguage) ?? .english
+                localModel.from = CCAiLanguage(rawValue: model.sourceLanguage) ?? .chinse
+                localModel.to = CCAiLanguage(rawValue: model.targetLanguage) ?? .english
                 setupViews(data: localModel)
             }
             else{
@@ -304,7 +304,7 @@ extension RecordDetailVC:RecordDetailTopBarDelegate{
 }
 extension RecordDetailVC:RecordDetailBarDelegate{
     func recordDetailBarTranstlateAction(_ bar: RecordDetailBar) {
-        var list = AiSupportLanguage.translate.map{$0.title}
+        var list = CCAiLanguage.translate.map{$0.title}
 //        list = list.filter { $0 != data!.from.title }
         
         let v = CustomPicker(title: "请选择语言".l10n, list:list )
@@ -313,7 +313,7 @@ extension RecordDetailVC:RecordDetailBarDelegate{
         v.show()
         v.didSelected = {[weak self] (index,value) in
             guard let self = self else { return  }
-            data!.to = AiSupportLanguage.translate.first(where: {$0.title == value})!
+            data!.to = CCAiLanguage.translate.first(where: {$0.title == value})!
             translateAction()
             if !topBar.tranlateItem.isSelected {
                 topBar.tralateAction()
index 2ff25d8..2251ded 100644 (file)
@@ -36,7 +36,7 @@ class CurrentDeviceView: BaseView {
         if let device = DeviceVM.shared.currentDevice{
             imageView.kf.setImage(with: device.image.yc.asUrl)
             
-            if JoyBleManager.shared.isConnetd {
+            if CCBleManager.shared.isConnetd {
                 alpha = 1
             }
             else{
index 77165c2..6a0367d 100644 (file)
@@ -78,7 +78,7 @@ class HomeFunctionView: BaseView {
         var y = 0.0
         for (index, value) in list.enumerated() {
             let view = HomeCell()
-            view.enable = JoyBleManager.shared.isConnetd
+            view.enable = CCBleManager.shared.isConnetd
             addSubview(view)
             
             view.type = value
@@ -99,7 +99,7 @@ class HomeFunctionView: BaseView {
     @objc func deviceChange(_ noti:Notification){
         for item in self.subviews{
             if let view = item as? HomeCell  {
-                view.enable = JoyBleManager.shared.isConnetd
+                view.enable = CCBleManager.shared.isConnetd
             }
         }
     }
@@ -180,7 +180,7 @@ class HomeCell: BaseView {
         }
     }
     @objc func tapAction(){
-        if !JoyBleManager.shared.isConnetd {
+        if !CCBleManager.shared.isConnetd {
             return
         }
         switch type {
index 4af2def..fcc0708 100644 (file)
@@ -51,7 +51,7 @@ class HomeHeadView: BaseView {
             v.text = "AI" + "伙伴,随叫随到".l10n
         }
         arrowIcon.image = UIImage(named: "arrow_2")
-        self.enable = JoyBleManager.shared.isConnetd
+        self.enable = CCBleManager.shared.isConnetd
         NotificationManager.add(self, selector: #selector(deviceChange(_:)), forName: .deviceValidChange)
     }
     
@@ -87,12 +87,12 @@ class HomeHeadView: BaseView {
         
     }
     @objc func chatAction(){
-        if JoyBleManager.shared.isConnetd {
+        if CCBleManager.shared.isConnetd {
             App.shared.goToPage(ChatVC())
         }
     }
     @objc func deviceChange(_ noti:Notification){
-        self.enable = JoyBleManager.shared.isConnetd
+        self.enable = CCBleManager.shared.isConnetd
     }
 }
 
index 40334fa..82d035b 100644 (file)
@@ -46,7 +46,7 @@ class BleScanVC: BaseVC{
         }
     }
     override func setupData() {
-        JoyBleManager.shared.discoverDeviceCallback = {[weak self] devices in
+        CCBleManager.shared.discoverDeviceCallback = {[weak self] devices in
             self?.list = devices
             self?.tableView.reloadData()
             if devices.count > 0 {
index 647193b..e1e5a99 100644 (file)
@@ -11,7 +11,7 @@ class DeviceVM:BaseVM{
     
     var currentDevice:HomeDeviceModel?{
         for item in dataList {
-            if let device = JoyBleManager.shared.connectPeripheral,device.mac == item.mac {
+            if let device = CCBleManager.shared.connectPeripheral,device.mac == item.mac {
                 return item
             }
         }
@@ -32,17 +32,17 @@ class DeviceVM:BaseVM{
 
 extension DeviceVM{
     static func startScan(){
-        JoyBleManager.shared.startScanDevice()
+        CCBleManager.shared.startScanDevice()
         
-        JoyBleManager.shared.didConnectDeviceCallback = {  device in
+        CCBleManager.shared.didConnectDeviceCallback = {  device in
             self.getDeviceInfo(device)
         }
-        JoyBleManager.shared.conetedFailureCallback = {  device in
+        CCBleManager.shared.conetedFailureCallback = {  device in
             self.showError()
         }
     }
     static func stopScan(){
-        JoyBleManager.shared.stopScanDevice()
+        CCBleManager.shared.stopScanDevice()
     }
     static func startConnecte(_ data:DCPeripheral){
         guard let name = data.device.name else {
@@ -58,7 +58,7 @@ extension DeviceVM{
                 ConnectPopView.shared.titleLabel.text = name
                 ConnectPopView.shared.stateDidChange(.connecting)
             }
-            JoyBleManager.shared.connectPeripheral(data)
+            CCBleManager.shared.connectPeripheral(data)
 
         }
     }
@@ -66,12 +66,12 @@ extension DeviceVM{
     static func getDeviceInfo(_ device:DCPeripheral){
         guard let prodName = device.device.name,prodName.count > 0 else{
             showError()
-            JoyBleManager.shared.cancel()
+            CCBleManager.shared.cancel()
             return
         }
-        JoyDevice.getDN { dn in
+        CCDevice.getDN { dn in
             guard let deviceName = dn else{
-                JoyBleManager.shared.cancel()
+                CCBleManager.shared.cancel()
                 self.showError()
                 return
             }
@@ -94,7 +94,7 @@ extension DeviceVM{
             }
             else{
                 self.showError()
-                JoyBleManager.shared.cancel()
+                CCBleManager.shared.cancel()
             }
         }
     }
@@ -143,11 +143,11 @@ extension DeviceVM{
 
 extension DeviceVM{
     static func updateOtaVersion(){
-        JoyDevice.getVersion { version in
+        CCDevice.getVersion { version in
             guard let v = version else{
                 return
             }
-            JoyDevice.getDN { dn in
+            CCDevice.getDN { dn in
                 guard let deviceName = dn else{
                     return
                 }
@@ -163,7 +163,7 @@ extension DeviceVM{
     }
     
     static func settingsConnected(){
-        let list = JoyBleManager.shared.checkSettingsConnected()
+        let list = CCBleManager.shared.checkSettingsConnected()
         if list.count == 0{
             CustomAlert.showWith(title: "提示", messgage: "请前往系统设置连接蓝牙") {
                 
index efea135..146ff75 100644 (file)
@@ -197,7 +197,7 @@ class StereoCallVC:BaseVC{
 }
 
 extension StereoCallVC:FieldRecordBarDelegate{
-    func fieldRecordBar(_ bar: FieldRecordBar, languageChange language: AiSupportLanguage) {
+    func fieldRecordBar(_ bar: FieldRecordBar, languageChange language: CCAiLanguage) {
         JoySdkManager.shared.callRecord.setCallRecoordLanage(language)
         AiLanguageCache.save(type: .thly, lan: language)
     }
@@ -220,7 +220,7 @@ extension StereoCallVC:FieldRecordBarDelegate{
         JoySdkManager.shared.callRecord.callRecordStop()
         toolBar.startAnimating()
     }
-    func gotoDetail( fileName:String,wavPath:String,language:AiSupportLanguage){
+    func gotoDetail( fileName:String,wavPath:String,language:CCAiLanguage){
         let model = RecordDetailModel()
         model.type = .phone
         model.from = language
index ab1367d..42b2f25 100644 (file)
@@ -179,7 +179,7 @@ fileprivate class FooterView: BaseView {
             if model.isSuccess{
                 YLprogressHUD.hidden()
                 DeviceVM.shared.dataList.removeAll(where: {$0.deviceId == self.deviceModel.deviceId})
-                JoyBleManager.shared.cancel()
+                CCBleManager.shared.cancel()
                 App.shared.popPage()
             }
             else{
index a8447e2..c87a509 100644 (file)
@@ -56,7 +56,7 @@ class FeedbackBottomView: BaseView {
         let icon = UIImageView()
         let titleLabel = UILabel()
         
-        var language:AiSupportLanguage = AiSupportLanguage.chinse{
+        var language:CCAiLanguage = CCAiLanguage.chinse{
             didSet{
                 titleLabel.text = language.title
             }
index 36b2197..3492798 100644 (file)
@@ -8,12 +8,12 @@
 class BleUpdateVM:BaseVM{
     static let shared = BleUpdateVM()
     func checkedUpdate(){
-        JoyDevice.getDN {[weak self] dn in
+        CCDevice.getDN {[weak self] dn in
             guard let self = self else{return}
             guard let deviceName = dn else{
                 return
             }
-            JoyDevice.getVersion {[weak self] version in
+            CCDevice.getVersion {[weak self] version in
                 guard let self = self else{return}
                 guard let version = version else{
                     return
index cdce644..0df5ea2 100644 (file)
@@ -54,7 +54,7 @@ class UpdateVC:BaseVC{
         }
     }
     override func setupData() {
-        JoyDevice.getVersion {[weak self] version in
+        CCDevice.getVersion {[weak self] version in
             guard let self = self else{return}
             let version = version ?? " --"
             let allText = "当前版本".l10n + "\nV\(version)"
@@ -69,7 +69,7 @@ class UpdateVC:BaseVC{
         }
     }
     @objc func tapAction(){
-        if !JoyBleManager.shared.isConnetd{
+        if !CCBleManager.shared.isConnetd{
             YLprogressHUD.showAutoHiden("请先连接设备".l10n)
             return
         }
index fd66b08..c11d0e2 100644 (file)
@@ -134,7 +134,7 @@ class CustomEqVC:BaseVC{
     }
     
     override func setupData() {
-        JoyDevice.getCustomEQ {[weak self] list in
+        CCDevice.getCustomEQ {[weak self] list in
             guard let list = list else{return}
             self?.resetSlider(list)
         }
@@ -143,10 +143,10 @@ class CustomEqVC:BaseVC{
         for item in list {
             item.slider.setValue(0, animated: false)
         }
-        JoyDevice.resetCustomEQ()
+        CCDevice.resetCustomEQ()
     }
     @objc func sliderValueChange(index:Int,value:Int){
-        JoyDevice.setCustomEQ(index: index, value: value)
+        CCDevice.setCustomEQ(index: index, value: value)
     }
     func resetSlider(_ eqs:[NSNumber]){
         for i in 0..<eqs.count {
index fb84042..2328be0 100644 (file)
@@ -39,7 +39,7 @@ class FindVC:BaseVC{
             v.value = "R"
         }
         titleLabel.do { v in
-            v.text =  JoyBleManager.shared.connectPeripheral?.device.name ?? ""
+            v.text =  CCBleManager.shared.connectPeripheral?.device.name ?? ""
             v.font = .regular(20)
             v.textColor = .hexString("#121212")
             
@@ -139,7 +139,7 @@ class FindVC:BaseVC{
         else if rightRadar.start{
             mode = .right
         }
-        JoyDevice.findHeadphone(mode)
+        CCDevice.findHeadphone(mode)
     }
 }
 
index 07fc6de..7619224 100644 (file)
@@ -70,7 +70,7 @@ class ModeEffectsView: BaseView {
         updateState()
     }
     func updateState(){
-        if JoyBleManager.shared.isConnetd {
+        if CCBleManager.shared.isConnetd {
             alpha = 1
         }
         else{
@@ -85,7 +85,7 @@ class ModeEffectsView: BaseView {
     }
     
     @objc func tapAction(_ tap:UITapGestureRecognizer){
-        if !JoyBleManager.shared.isConnetd {
+        if !CCBleManager.shared.isConnetd {
             return
         }
         let view = tap.view as! ItemView
index 0dab60c..87899a1 100644 (file)
@@ -21,7 +21,7 @@ class ModeVC:BaseVC{
     }
     
     override func setupViews() {
-        self.navBar.title = JoyBleManager.shared.connectPeripheral?.device.name ?? ""
+        self.navBar.title = CCBleManager.shared.connectPeripheral?.device.name ?? ""
         navBar.backgroundColor = .clear
         view.backgroundColor = .color(.bgColor)
         
@@ -70,7 +70,7 @@ class ModeVC:BaseVC{
         }
     }
     override func setupData() {
-        JoyDevice.getEQMode {[weak self] type in
+        CCDevice.getEQMode {[weak self] type in
               guard let self = self else{return}
               effectsView.mode = type ?? .normal
         }
@@ -86,20 +86,20 @@ extension ModeVC{
         updateState()
     }
     func updateState(){
-        self.findView.alpha = JoyBleManager.shared.isConnetd ? 1:0.3
+        self.findView.alpha = CCBleManager.shared.isConnetd ? 1:0.3
     }
     
     func selectedModeAction(_ mode:ModeEffectsType){
-        if !JoyBleManager.shared.isConnetd {
+        if !CCBleManager.shared.isConnetd {
             return
         }
-        JoyDevice.setEQMode(mode)
+        CCDevice.setEQMode(mode)
         if mode == .custom {
             App.shared.goToPage(CustomEqVC())
         }
     }
     @objc func findAction(){
-        if JoyBleManager.shared.isConnetd {
+        if CCBleManager.shared.isConnetd {
             App.shared.goToPage(FindVC())
         }
         
index e8efc4a..e070c70 100644 (file)
@@ -83,7 +83,7 @@ class ConnectPopView: BasePresentView2 {
             v.textColor = .rgb(0x121212)
             v.font = .regular(20)
             v.textAlignment = .center
-            v.text = JoyBleManager.shared.connectPeripheral?.device.name ?? ""
+            v.text = CCBleManager.shared.connectPeripheral?.device.name ?? ""
         }
         desLabel.do { (v) in
             v.textColor = .rgb(0x121212)
index 1ef12d3..e906344 100644 (file)
@@ -13,7 +13,7 @@ class LanguagePickerTitle: BaseView {
     let switcIcon = UIImageView()
     var valueChange:(()->Void)?
     
-    var currentLanguage:AiSupportLanguage{
+    var currentLanguage:CCAiLanguage{
         if isRight {
             return rightLabel.language
         }
@@ -109,7 +109,7 @@ class LanguagePickerTitle: BaseView {
     
     class LanguageItem: BaseView {
         private let label = UILabel()
-        var language:AiSupportLanguage = .chinse{
+        var language:CCAiLanguage = .chinse{
             didSet{
                 label.text = language.title
             }
index 36024dd..536eae0 100644 (file)
@@ -10,7 +10,7 @@ class LanguagePickerView: BasePresentView {
     private let segView = LanguagePickerTitle()
     private let btn = UIButton(type: .custom)
     private let tableView = UITableView(frame: .zero, style: .plain)
-    var list:[AiSupportLanguage] = []
+    var list:[CCAiLanguage] = []
     var selectedIndex = 0{
         didSet{
             tableView.reloadData()
@@ -18,10 +18,10 @@ class LanguagePickerView: BasePresentView {
     }
     
     
-    var didSelected: ((Int,AiSupportLanguage)->Void)?
+    var didSelected: ((Int,CCAiLanguage)->Void)?
     private var title:String = "请选择语言".l10n
     
-    init(languages:[AiSupportLanguage],isLeft:Bool,left:AiSupportLanguage,right:AiSupportLanguage) {
+    init(languages:[CCAiLanguage],isLeft:Bool,left:CCAiLanguage,right:CCAiLanguage) {
         list = languages
         segView.leftLabel.language = left
         segView.rightLabel.language = right
index e5b26a9..b00f1b1 100644 (file)
@@ -63,7 +63,7 @@ class LanguageSelectItem: BaseView {
         rightLabel.language = text1
     }
     @objc func leftAction(){
-        let v = LanguagePickerView(languages: AiSupportLanguage.translate,isLeft: true,left: leftLabel.language,right: rightLabel.language)
+        let v = LanguagePickerView(languages: CCAiLanguage.translate,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: AiSupportLanguage.translate,isLeft: false,left: leftLabel.language,right: rightLabel.language)
+        let v = LanguagePickerView(languages: CCAiLanguage.translate,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
@@ -97,7 +97,7 @@ class LanguageSelectItem: BaseView {
     
     class LanguageItem: BaseView {
         private let label = UILabel()
-        var language:AiSupportLanguage = AiSupportLanguage.chinse{
+        var language:CCAiLanguage = CCAiLanguage.chinse{
             didSet{
                 label.text = language.title
             }
diff --git a/document/20251226-095425.jpg b/document/20251226-095425.jpg
new file mode 100644 (file)
index 0000000..f7bc4bd
Binary files /dev/null and b/document/20251226-095425.jpg differ