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)
}
}
}
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) {
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"
// Created by liangshi on 2025/11/24.
//
-//
-// Untitled.swift
-// ShenYin
-//
-// Created by liangshi on 2025/8/28.
-//
-
import UIKit
import CoreBluetooth
import DeepChordsSdk
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?) {
}
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
}
}
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 ?? ""
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
self.token = nil
self.info = UserInfo()
UserCache.shared.remove()
- JoyBleManager.shared.cancel()
+ CCBleManager.shared.cancel()
NotificationManager.post(type: .logout, objtect: nil)
App.shared.goToLogin()
}
import Foundation
import JoyGemAI
-enum AiSupportLanguage:String{
+enum CCAiLanguage:String{
case chinse = "chinse"
case english = "english"
case japanese = "japanese"
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{
//
-// Untitled.swift
+// CCBleManager.swift
// ShenYin
//
-// Created by liangshi on 2025/8/28.
+// Created by liangshi on 2025/12/25.
//
import UIKit
}
}
-class JoyBleManager: NSObject {
+class CCBleManager: NSObject {
var discoverDeviceCallback: (([DCPeripheral]) -> Void)?
var didConnectDeviceCallback: ((DCPeripheral) -> Void)?
var conetedFailureCallback: ((DCPeripheral) -> Void)?
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() {
centralManager = CBCentralManager(delegate: self, queue: nil)
}
}
-extension JoyBleManager:CBCentralManagerDelegate{
+extension CCBleManager:CBCentralManagerDelegate{
func centralManagerDidUpdateState(_ central: CBCentralManager) {
Logger.debug("蓝牙状态",central.state.rawValue)
switch central.state {
NotificationManager.post(type: .deviceValidChange, objtect: nil)
break
case.poweredOn:
-// startScanDevice()
+ // startScanDevice()
checkConectState()
break
@unknown default:
}
}
-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?) {
}
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 {
}
}
-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])
}
}
}
-extension JoyBleManager{
+extension CCBleManager{
func joySdkSend(_ data: Data, with characteristic: CBCharacteristic) {
if let connectPeripheral = connectPeripheral{
connectPeripheral.device.writeValue(data, for: characteristic, type:.withoutResponse)
}
}
-extension JoyBleManager{
+extension CCBleManager{
func isConected(mac:String)->Bool{
guard let device = connectPeripheral else { return false }
if device.mac == mac {
}
}
-// #连接有问题,应当获取设置里面已连接的设备
+ // #连接有问题,应当获取设置里面已连接的设备
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)
}
}
-extension JoyBleManager{
+extension CCBleManager{
func checkConectState(){
guard let mac = connectPeripheral?.mac else {
return
//
-// JoyDevice.swift
+// Device.swift
// ShenYin
//
-// Created by liangshi on 2025/12/5.
+// Created by liangshi on 2025/12/25.
//
import JoyGemAI
}
}
-class JoyDevice{
+class CCDevice{
static func findHeadphone(_ mode:FindType){
JoyGemAIManager.shared().device.findHeadphone(mode.value) { err in
Logger.debug("findHeadphone:\(err)");
}
}
}
-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)");
}
}
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
--- /dev/null
+//
+// 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 = ""
+}
--- /dev/null
+//
+// CCSdkManager.swift
+// ShenYin
+//
+// Created by liangshi on 2025/12/25.
+//
+
+class CCSdkManager {
+
+
+
+}
--- /dev/null
+////
+//// 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) {
+//
+// }
+//}
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 {
}
}
}
+ 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?{
}
- func setCallRecoordLanage(_ language:AiSupportLanguage){
+ func setCallRecoordLanage(_ language:CCAiLanguage){
JoyGemCallManager.shared().originalLanguage = language.value
}
func callRecordStart(){
--- /dev/null
+////
+//// 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)
+// }
+// }
+//}
JoyGemRecordManager.shared().delegate = self
}
- func setRecoordLanage(_ language:AiSupportLanguage){
+ func setRecoordLanage(_ language:CCAiLanguage){
JoyGemRecordManager.shared().originalLanguage = language.value
}
func recordStart(){
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()
}
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)
}
}
}
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)
}
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
}
func reloadData() {
DeviceVM.shared.refresh {[weak self] result in
self?.collectionView.reloadData()
- if JoyBleManager.shared.isConnetd{
+ if CCBleManager.shared.isConnetd{
return
}
var autoConnetced = false
override func navRightViewTapped() {
App.shared.goToPage(BleScanVC())
// App.shared.goToPage(CalendarPickerVC())
-// JoyBleManager.shared.checkSettingsConnected()
+// CCBleManager.shared.checkSettingsConnected()
// ChatCache.shared.LargeDateDemoSave()
}
@objc func editAction(){
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{
}
}
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){
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
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
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
let titleLabel = UILabel()
let valueLabel = UILabel()
- var language:AiSupportLanguage = AiSupportLanguage.chinse{
+ var language:CCAiLanguage = CCAiLanguage.chinse{
didSet{
titleLabel.text = language.title
}
}
protocol FieldRecordBarDelegate:NSObject {
- func fieldRecordBar(_ bar:FieldRecordBar,languageChange language:AiSupportLanguage)
+ func fieldRecordBar(_ bar:FieldRecordBar,languageChange language:CCAiLanguage)
func fieldRecordBar(_ bar:FieldRecordBar,stateChange state:RecordSate)
}
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
class RecordBarItem: BaseView {
private let icon = UIImageView()
private let titleLabel = UILabel()
- var language:AiSupportLanguage = .chinse{
+ var language:CCAiLanguage = .chinse{
didSet{
titleLabel.text = language.title
}
}
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)
}
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))
}
}
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
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
let titleLabel = UILabel()
let valueLabel = UILabel()
- var language:AiSupportLanguage = AiSupportLanguage.chinse{
+ var language:CCAiLanguage = CCAiLanguage.chinse{
didSet{
titleLabel.text = language.title
}
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{
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{
}
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 )
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()
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{
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
@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
}
}
}
}
}
@objc func tapAction(){
- if !JoyBleManager.shared.isConnetd {
+ if !CCBleManager.shared.isConnetd {
return
}
switch type {
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)
}
}
@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
}
}
}
}
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 {
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
}
}
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 {
ConnectPopView.shared.titleLabel.text = name
ConnectPopView.shared.stateDidChange(.connecting)
}
- JoyBleManager.shared.connectPeripheral(data)
+ CCBleManager.shared.connectPeripheral(data)
}
}
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
}
}
else{
self.showError()
- JoyBleManager.shared.cancel()
+ CCBleManager.shared.cancel()
}
}
}
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
}
}
static func settingsConnected(){
- let list = JoyBleManager.shared.checkSettingsConnected()
+ let list = CCBleManager.shared.checkSettingsConnected()
if list.count == 0{
CustomAlert.showWith(title: "提示", messgage: "请前往系统设置连接蓝牙") {
}
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)
}
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
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{
let icon = UIImageView()
let titleLabel = UILabel()
- var language:AiSupportLanguage = AiSupportLanguage.chinse{
+ var language:CCAiLanguage = CCAiLanguage.chinse{
didSet{
titleLabel.text = language.title
}
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
}
}
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)"
}
}
@objc func tapAction(){
- if !JoyBleManager.shared.isConnetd{
+ if !CCBleManager.shared.isConnetd{
YLprogressHUD.showAutoHiden("请先连接设备".l10n)
return
}
}
override func setupData() {
- JoyDevice.getCustomEQ {[weak self] list in
+ CCDevice.getCustomEQ {[weak self] list in
guard let list = list else{return}
self?.resetSlider(list)
}
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 {
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")
else if rightRadar.start{
mode = .right
}
- JoyDevice.findHeadphone(mode)
+ CCDevice.findHeadphone(mode)
}
}
updateState()
}
func updateState(){
- if JoyBleManager.shared.isConnetd {
+ if CCBleManager.shared.isConnetd {
alpha = 1
}
else{
}
@objc func tapAction(_ tap:UITapGestureRecognizer){
- if !JoyBleManager.shared.isConnetd {
+ if !CCBleManager.shared.isConnetd {
return
}
let view = tap.view as! ItemView
}
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)
}
}
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
}
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())
}
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)
let switcIcon = UIImageView()
var valueChange:(()->Void)?
- var currentLanguage:AiSupportLanguage{
+ var currentLanguage:CCAiLanguage{
if isRight {
return rightLabel.language
}
class LanguageItem: BaseView {
private let label = UILabel()
- var language:AiSupportLanguage = .chinse{
+ var language:CCAiLanguage = .chinse{
didSet{
label.text = language.title
}
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()
}
- 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
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
}
}
@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
class LanguageItem: BaseView {
private let label = UILabel()
- var language:AiSupportLanguage = AiSupportLanguage.chinse{
+ var language:CCAiLanguage = CCAiLanguage.chinse{
didSet{
label.text = language.title
}