ソースを参照

调音器问题修复

Steven 1 年間 前
コミット
575851c5af
16 ファイル変更146 行追加58 行削除
  1. 4 4
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. 2 1
      KulexiuForTeacher/KulexiuForTeacher/AppDelegate.m
  3. 18 18
      KulexiuForTeacher/KulexiuForTeacher/Common/Define/KSDomain.h
  4. 3 3
      KulexiuForTeacher/KulexiuForTeacher/KSTouchCapturingWindow.m
  5. 39 5
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/TenantGroup/TenantChooseMemberViewController.m
  6. 0 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupMemberViewController.m
  7. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Model/Tenant/TenantStuModel.h
  8. 9 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Model/Tenant/TenantStuModel.m
  9. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/TenantGroupCreate/TenentGroupAddMemberCell.m
  10. 15 3
      KulexiuForTeacher/KulexiuForTeacher/Module/TXClassRoom/Controller/TXClassroomViewController.m
  11. 2 0
      KulexiuForTeacher/KulexiuForTeacher/Module/TXClassRoom/View/ClassroomTitleView/TXClassTitleView.h
  12. 3 0
      KulexiuForTeacher/KulexiuForTeacher/Module/TXClassRoom/View/ClassroomTitleView/TXClassTitleView.m
  13. 6 3
      KulexiuForTeacher/KulexiuForTeacher/Module/TXLiveModule/Controller/TXLiveRoomViewController.m
  14. 29 14
      KulexiuForTeacher/KulexiuForTeacher/Module/Widget/Controller/ToneTuningViewController.m
  15. 7 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Widget/Model/TuningFunction/Tuner.swift
  16. 7 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Widget/View/KSGaugeView/KSGaugeView.m

+ 4 - 4
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj

@@ -9356,7 +9356,7 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = KulexiuForTeacher/KulexiuForTeacher.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1.5.2;
+				CURRENT_PROJECT_VERSION = 1.5.3;
 				DEVELOPMENT_TEAM = B2AP53HHTU;
 				ENABLE_BITCODE = NO;
 				ENABLE_MODULE_VERIFIER = YES;
@@ -9402,7 +9402,7 @@
 					"$(PROJECT_DIR)/KulexiuForTeacher/Common/ThirdPart/UMSocialSDK/share/share_ios_6.10.4/SocialLibraries/QQ",
 					"$(PROJECT_DIR)/KulexiuForTeacher/Common/ThirdPart/UMSocialSDK/share/share_ios_6.10.4/UMSocialSDKPlugin",
 				);
-				MARKETING_VERSION = 1.5.2;
+				MARKETING_VERSION = 1.5.3;
 				MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
 				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17";
 				OTHER_LDFLAGS = (
@@ -9557,7 +9557,7 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = KulexiuForTeacher/KulexiuForTeacher.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1.5.2;
+				CURRENT_PROJECT_VERSION = 1.5.3;
 				DEVELOPMENT_TEAM = B2AP53HHTU;
 				ENABLE_BITCODE = NO;
 				ENABLE_MODULE_VERIFIER = YES;
@@ -9603,7 +9603,7 @@
 					"$(PROJECT_DIR)/KulexiuForTeacher/Common/ThirdPart/UMSocialSDK/share/share_ios_6.10.4/SocialLibraries/QQ",
 					"$(PROJECT_DIR)/KulexiuForTeacher/Common/ThirdPart/UMSocialSDK/share/share_ios_6.10.4/UMSocialSDKPlugin",
 				);
-				MARKETING_VERSION = 1.5.2;
+				MARKETING_VERSION = 1.5.3;
 				MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
 				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17";
 				OTHER_LDFLAGS = (

+ 2 - 1
KulexiuForTeacher/KulexiuForTeacher/AppDelegate.m

@@ -430,7 +430,8 @@ didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
 
 - (void)checkConnectionStatus {
     BOOL isConnected = [TXIM_LINSENTER isCurrentUserLoginIM];
-    if (isConnected == NO) { // 连接失败或未连接 需要重新连接
+    NSString *token = UserDefault(TokenKey);
+    if (isConnected == NO && ![NSString isEmptyString:token]) { // 连接失败或未连接 需要重新连接
         [USER_MANAGER checkTokenEnableConnectIM];
     }
 }

+ 18 - 18
KulexiuForTeacher/KulexiuForTeacher/Common/Define/KSDomain.h

@@ -24,15 +24,15 @@
 //#define TXOfflinePushCertificateIDForAPNS (39559)
 
 // 测试环境
-#define hostURL (@"https://test.colexiu.com")
-#define SEALCLASSHOST (@"https://test.colexiu.com/api-classroom")
-#define WEBHOST (@"https://test.colexiu.com/teacher")
-#define SOCKET_URL (@"wss://test.colexiu.com/audioAnalysis")
-#define JSPUSH_ENVIRONMENT (NO)
-#define RCIM_KEY (@"0vnjpoad0jbdz")
-#define SUBMIT_UUID (NO)
-#define CONFIG_TXSDKAPPID (1400805079)
-#define TXOfflinePushCertificateIDForAPNS (39559)
+//#define hostURL (@"https://test.colexiu.com")
+//#define SEALCLASSHOST (@"https://test.colexiu.com/api-classroom")
+//#define WEBHOST (@"https://test.colexiu.com/teacher")
+//#define SOCKET_URL (@"wss://test.colexiu.com/audioAnalysis")
+//#define JSPUSH_ENVIRONMENT (NO)
+//#define RCIM_KEY (@"0vnjpoad0jbdz")
+//#define SUBMIT_UUID (NO)
+//#define CONFIG_TXSDKAPPID (1400805079)
+//#define TXOfflinePushCertificateIDForAPNS (39559)
 
 // 预生产
 //#define hostURL (@"https://ponline.colexiu.com")
@@ -47,15 +47,15 @@
 
 //#else
 
-//#define hostURL (@"https://online.colexiu.com")
-//#define SEALCLASSHOST (@"https://online.colexiu.com/api-classroom")
-//#define WEBHOST (@"https://online.colexiu.com/teacher")
-//#define SOCKET_URL (@"wss://online.colexiu.com/audioAnalysis")
-//#define JSPUSH_ENVIRONMENT (YES)
-//#define RCIM_KEY (@"e5t4ouvpe42pa")
-//#define SUBMIT_UUID (YES)
-//#define CONFIG_TXSDKAPPID (1400799837)
-//#define TXOfflinePushCertificateIDForAPNS (39561)
+#define hostURL (@"https://online.colexiu.com")
+#define SEALCLASSHOST (@"https://online.colexiu.com/api-classroom")
+#define WEBHOST (@"https://online.colexiu.com/teacher")
+#define SOCKET_URL (@"wss://online.colexiu.com/audioAnalysis")
+#define JSPUSH_ENVIRONMENT (YES)
+#define RCIM_KEY (@"e5t4ouvpe42pa")
+#define SUBMIT_UUID (YES)
+#define CONFIG_TXSDKAPPID (1400799837)
+#define TXOfflinePushCertificateIDForAPNS (39561)
 
 //#endif
 

+ 3 - 3
KulexiuForTeacher/KulexiuForTeacher/KSTouchCapturingWindow.m

@@ -41,20 +41,20 @@
     else if (touch.phase == UITouchPhaseMoved) {
         if ( touchView ) {
             [touchView touchesMoved:[event allTouches] withEvent:event];
-            }
         }
+    }
     else if (touch.phase == UITouchPhaseCancelled) {
         if ( touchView ) {
             [touchView touchesCancelled:[event allTouches] withEvent:event];
             touchView = nil;
-            }
         }
+    }
     else if (touch.phase == UITouchPhaseEnded) {
         if ( touchView ) {
             [touchView touchesEnded:[event allTouches] withEvent:event];
             touchView = nil;
-            }
         }
+    }
     //we need to send the message to the super for the
     //text overlay to work (holding touch to show copy/paste)
     [super sendEvent:event];

+ 39 - 5
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/TenantGroup/TenantChooseMemberViewController.m

@@ -151,7 +151,7 @@
 }
 
 - (BOOL)getStuChooseStatus:(NSString *)userId {
-    for (TenantStuModel *chooseModel in self.preChooseMember) {
+    for (TenantStuModel *chooseModel in self.chooseArray) {
         if ([userId isEqualToString:chooseModel.imUserId]) {
             return YES;
         }
@@ -168,14 +168,13 @@
             [memArray addObject:model];
         }
     }
+    
     stuArray = [NSMutableArray arrayWithArray:memArray];
     self.dataArray = [NSMutableArray array];
-    self.chooseArray = [NSMutableArray array];
     for (TenantStuModel *model in stuArray) {
         BOOL isChoose = [self getStuChooseStatus:model.imUserId];
         if (isChoose) {
             model.isChoose = YES;
-            [self.chooseArray addObject:model];
         }
         [self.dataArray addObject:model];
     }
@@ -223,14 +222,39 @@
     TenantStuModel *model = self.dataArray[indexPath.row];
     model.isChoose = !model.isChoose;
     if (model.isChoose) {
-        [self.chooseArray addObject:model];
+        [self addChooseStudent:model];
     }
     else {
-        [self.chooseArray removeObject:model];
+        [self removeChooseStudent:model];
     }
     [self refreshStatus];
 }
 
+- (BOOL)isChooseArrayContainUser:(NSString *)imUserId {
+    for (TenantStuModel *model in self.chooseArray) {
+        if ([imUserId isEqualToString:model.imUserId]) {
+            return YES;
+        }
+    }
+    return NO;
+}
+
+
+- (void)addChooseStudent:(TenantStuModel *)model {
+    if (![self isChooseArrayContainUser:model.imUserId]) {
+        [self.chooseArray addObject:model];
+    }
+}
+
+- (void)removeChooseStudent:(TenantStuModel *)stuModel {
+    for (TenantStuModel *model in self.chooseArray) {
+        if ([model.imUserId isEqualToString:stuModel.imUserId]) {
+            [self.chooseArray removeObject:model];
+            return;
+        }
+    }
+}
+
 - (void)refreshStatus {
     NSInteger count = self.chooseArray.count;
     NSString *desc = @"完成";
@@ -346,6 +370,16 @@
     self.groupId = groupId;
     [self requsetData];
 }
+
+- (void)setPreChooseMember:(NSMutableArray *)preChooseMember {
+    _preChooseMember = preChooseMember;
+    [self configChooseMember];
+}
+
+- (void)configChooseMember {
+    self.chooseArray = [NSMutableArray arrayWithArray:_preChooseMember];
+    [self refreshStatus];
+}
 /*
 #pragma mark - Navigation
 

+ 0 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupMemberViewController.m

@@ -65,7 +65,6 @@
 }
 
 - (void)evaluateMessge {
-    [LOADING_MANAGER MBShowInWindow:@"数据加载中......"];
     // 异步线程处理数据
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         NSMutableArray *sortArr = [NSMutableArray array];
@@ -100,7 +99,6 @@
         self.sourceIndexArray = sortArr;
         // 主线程刷新
         dispatch_async(dispatch_get_main_queue(), ^{
-            [LOADING_MANAGER removeHUD];
             self.tableView.sc_indexViewDataSource = self.sourceIndexArray;
             [self.tableView reloadData];
             [self changePromptLabelState];

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Model/Tenant/TenantStuModel.h

@@ -44,8 +44,8 @@
 @property (nonatomic, assign) double isReal;
 @property (nonatomic, assign) double lockFlag;
 @property (nonatomic, strong) NSString *membershipStartTime;
-//@property (nonatomic, strong) NSString *
 @property (nonatomic, strong) NSString *imUserId;
+@property (nonatomic, strong) NSString *tenantGroupName;
 
 @property (nonatomic, assign) BOOL isChoose;
 

+ 9 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Model/Tenant/TenantStuModel.m

@@ -41,7 +41,9 @@ NSString *const kTenantStuModelPhone = @"phone";
 NSString *const kTenantStuModelIsReal = @"isReal";
 NSString *const kTenantStuModelLockFlag = @"lockFlag";
 NSString *const kTenantStuModelMembershipStartTime = @"membershipStartTime";
-NSString *const kTenantStuModelImUserId= @"imUserId";
+NSString *const kTenantStuModelImUserId = @"imUserId";
+NSString *const kTenantStuModelTenantGroupName = @"tenantGroupName";
+
 
 @interface TenantStuModel ()
 
@@ -85,6 +87,7 @@ NSString *const kTenantStuModelImUserId= @"imUserId";
 @synthesize lockFlag = _lockFlag;
 @synthesize membershipStartTime = _membershipStartTime;
 @synthesize imUserId = _imUserId;
+@synthesize tenantGroupName = _tenantGroupName;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
 {
@@ -132,6 +135,7 @@ NSString *const kTenantStuModelImUserId= @"imUserId";
             self.lockFlag = [[self objectOrNilForKey:kTenantStuModelLockFlag fromDictionary:dict] doubleValue];
             self.membershipStartTime = [self objectOrNilForKey:kTenantStuModelMembershipStartTime fromDictionary:dict];
         self.imUserId = [self objectOrNilForKey:kTenantStuModelImUserId fromDictionary:dict];
+        self.tenantGroupName = [self objectOrNilForKey:kTenantStuModelTenantGroupName fromDictionary:dict];
     }
     
     return self;
@@ -175,6 +179,7 @@ NSString *const kTenantStuModelImUserId= @"imUserId";
     [mutableDict setValue:[NSNumber numberWithDouble:self.lockFlag] forKey:kTenantStuModelLockFlag];
     [mutableDict setValue:self.membershipStartTime forKey:kTenantStuModelMembershipStartTime];
     [mutableDict setValue:self.imUserId forKey:kTenantStuModelImUserId];
+    [mutableDict setValue:self.tenantGroupName forKey:kTenantStuModelTenantGroupName];
     return [NSDictionary dictionaryWithDictionary:mutableDict];
 }
 
@@ -235,6 +240,7 @@ NSString *const kTenantStuModelImUserId= @"imUserId";
     self.lockFlag = [aDecoder decodeDoubleForKey:kTenantStuModelLockFlag];
     self.membershipStartTime = [aDecoder decodeObjectForKey:kTenantStuModelMembershipStartTime];
     self.imUserId = [aDecoder decodeObjectForKey:kTenantStuModelImUserId];
+    self.tenantGroupName = [aDecoder decodeObjectForKey:kTenantStuModelTenantGroupName];
     return self;
 }
 
@@ -275,6 +281,7 @@ NSString *const kTenantStuModelImUserId= @"imUserId";
     [aCoder encodeDouble:_lockFlag forKey:kTenantStuModelLockFlag];
     [aCoder encodeObject:_membershipStartTime forKey:kTenantStuModelMembershipStartTime];
     [aCoder encodeObject:_imUserId forKey:kTenantStuModelImUserId];
+    [aCoder encodeObject:_tenantGroupName forKey:kTenantStuModelTenantGroupName];
 }
 
 - (id)copyWithZone:(NSZone *)zone
@@ -317,6 +324,7 @@ NSString *const kTenantStuModelImUserId= @"imUserId";
         copy.lockFlag = self.lockFlag;
         copy.membershipStartTime = [self.membershipStartTime copyWithZone:zone];
         copy.imUserId = [self.imUserId copyWithZone:zone];
+        copy.tenantGroupName = [self.tenantGroupName copyWithZone:zone];
     }
     
     return copy;

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/TenantGroupCreate/TenentGroupAddMemberCell.m

@@ -35,7 +35,7 @@
     [self.chooseImge setImage:[UIImage imageNamed:statusImage]];
     
     self.subjectName.text = [NSString returnNoNullStringWithString:model.subjectName];
-    self.tenantGroupName.text = [NSString returnNoNullStringWithString:model.tenantName];
+    self.tenantGroupName.text = [NSString returnNoNullStringWithString:model.tenantGroupName];
 }
 
 - (void)setSelected:(BOOL)selected animated:(BOOL)animated {

+ 15 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/TXClassRoom/Controller/TXClassroomViewController.m

@@ -387,11 +387,10 @@
     
     if ([touch.view isDescendantOfView:self.memberListView] || [touch.view isDescendantOfView:self.chatAreaView] || [touch.view isDescendantOfView:self.videoListView] || [touch.view isDescendantOfView:self.whiteboardListView]
         || [touch.view isDescendantOfView:self.squareView] || [touch.view isDescendantOfView:self.maskView] || [touch.view isDescendantOfView:self.toolView] || [touch.view isDescendantOfView:self.closeCourseAlert] || [touch.view isDescendantOfView:self.danView] || [touch.view isDescendantOfView:self.titleView]) {
+        [self.danView resetInputStatus];
         return NO;
     }
-//    if ([touch.view isDescendantOfView:self.containerView]) {
-//        [self tapGesture:(UITapGestureRecognizer *)gestureRecognizer];
-//    }
+
     return YES;
 }
 
@@ -467,6 +466,11 @@
             break;
         case ClassTitleViewActionTagDan: // 弹幕开关
         {
+            BOOL isWhiteBoard = [ClassroomService sharedService].currentRoom.currentDisplayType == DisplayWhiteboard;
+            if (tagButton.isSelected == YES && isWhiteBoard) { // 如果白板
+                [self.tipsView showTipsMessage:@"白板模式下不可开启弹幕" inView:self.view];
+                return;
+            }
             tagButton.isSelected = !tagButton.isSelected;
             if (tagButton.isSelected) { // 关闭弹幕
                 [self hideDanChatView];
@@ -1501,6 +1505,11 @@
     return _progressView;
 }
 
+- (void)hideDanView {
+    [self.titleView closeDanButton];
+    [self hideDanChatView];
+}
+
 - (void)teachToolView:(UIButton *)button didTapAtTag:(TeachToolTag)tag {
     switch (tag) {
         case TeachToolTagWhiteboard:
@@ -1529,6 +1538,8 @@
                 [self.whiteboardListView reloadDataSource];
                 // 收起
                 [self.toolView hiddenToolViewWithAnimation:YES];
+                
+                [self hideDanView];
             });
         }
             break;
@@ -2167,6 +2178,7 @@
 }
 
 - (void)backWhiteboardView {
+    [self hideDanView];
     [ClassroomService sharedService].currentRoom.currentDisplayType = DisplayWhiteboard;
     [ClassroomService sharedService].currentRoom.currentDisplayURI = @"whiteboard";
     [self renderMainContainerView];

+ 2 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/TXClassRoom/View/ClassroomTitleView/TXClassTitleView.h

@@ -68,6 +68,8 @@ NS_ASSUME_NONNULL_BEGIN
 
 - (void)updateUserVolume:(NSInteger)volume;
 
+- (void)closeDanButton;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 3 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/TXClassRoom/View/ClassroomTitleView/TXClassTitleView.m

@@ -452,6 +452,9 @@
     [[NSNotificationCenter defaultCenter] removeObserver:self];
 }
 
+- (void)closeDanButton {
+    self.danButton.isSelected = YES;
+}
 /*
 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.

+ 6 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/TXLiveModule/Controller/TXLiveRoomViewController.m

@@ -58,6 +58,8 @@ typedef NS_ENUM(NSInteger, LIVEPAGE) {
 
 /// 主讲人id
 @property (nonatomic, strong) NSString *createrId;
+
+@property (nonatomic, strong) NSString *speakerImUserId;
 /// 主讲人名称
 @property (nonatomic, strong) NSString *createrName;
 /// 主讲人头像
@@ -472,6 +474,7 @@ typedef NS_ENUM(NSInteger, LIVEPAGE) {
 
 - (void)setupLiveroomConfig:(NSDictionary *)source {
     self.createrId = [source ks_stringValueForKey:@"speakerId"];
+    self.speakerImUserId = [source ks_stringValueForKey:@"speakerImUserId"];
     self.createrName = [source ks_stringValueForKey:@"speakerName"];
     self.createrAvatal = [source ks_stringValueForKey:@"speakerPic"];
     NSInteger lookCount = [source ks_integerValueForKey:@"lookNum"];
@@ -1574,7 +1577,7 @@ typedef NS_ENUM(NSInteger, LIVEPAGE) {
         cell = [[TXLiveChatListCell appearance] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TXLiveChatListCell"];
     }
     if ([model isMemberOfClass:[TXConstMessage class]] || [model isMemberOfClass:[TXLiveTextMessage class]] || [model isMemberOfClass:[TXLiveMessageWelcome class]] || [model isMemberOfClass:[TXLiveMessageLike class]] || [model isMemberOfClass:[TXLiveMessageSeatControl class]] ||[model isMemberOfClass:[TXLiveMessageChatBan class]] || [model isMemberOfClass:[TXLiveMessageSeatApply class]] || [model isMemberOfClass:[TXLiveMessageSeatResponse class]] || [model isMemberOfClass:[TXLiveMessageShopRush class]] || [model isMemberOfClass:[TXLiveMessageDownSeatAll class]] || [model isMemberOfClass:[TXLiveMessageRejectAllSeat class]] ){
-        [cell setDataModel:model createrId:self.createrId];
+        [cell setDataModel:model createrId:self.speakerImUserId];
     }
     
     return cell;
@@ -1952,7 +1955,7 @@ typedef NS_ENUM(NSInteger, LIVEPAGE) {
                 }
                 TXLiveMessageSeatResponse *responseMessage = [[TXLiveMessageSeatResponse alloc] init];
                 responseMessage.type = SEATRESPONSE_TEACHERAPPROVE;
-                responseMessage.teacherId = self.createrId;
+                responseMessage.teacherId = self.speakerImUserId;
                 responseMessage.teacherName = self.createrName;
                 responseMessage.audienceId = member.userId;
                 responseMessage.audienceName = member.name;
@@ -1971,7 +1974,7 @@ typedef NS_ENUM(NSInteger, LIVEPAGE) {
                 TXLiveMessageSeatApply *kickSeatMessage = [[TXLiveMessageSeatApply alloc] init];
                 kickSeatMessage.userInfo = [self getCurrentUser];
                 kickSeatMessage.type = SEATHANDLE_KICKSEAT;
-                kickSeatMessage.teacherId = self.createrId;
+                kickSeatMessage.teacherId = self.speakerImUserId;
                 kickSeatMessage.teacherName = self.createrName;
                 kickSeatMessage.audienceId = member.userId;
                 kickSeatMessage.audienceName = member.name;

+ 29 - 14
KulexiuForTeacher/KulexiuForTeacher/Module/Widget/Controller/ToneTuningViewController.m

@@ -181,11 +181,11 @@ static float correctTime = 0.5;
 }
 
 - (void)tunerDidUpdate:(Tuner *)tuner output:(TunerOutput *)output {
-//    NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970];
-//    if (fabs(self.lastCorrectTime - currentTime) < correctTime) {
-//        return;
-//    }
-//    self.lastCorrectTime = currentTime;
+    NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970];
+    if (fabs(self.lastCorrectTime - currentTime) < correctTime) {
+        return;
+    }
+    self.lastCorrectTime = currentTime;
 
     if (output.amplitude < 0.01) {
         
@@ -194,28 +194,43 @@ static float correctTime = 0.5;
         
         TunerOutput *transferOutput = [tuner getTransferPitchWithA4Frequency:self.A4Frequence toneChangeRate:self.toneChangeRate output:output];
 
-        self.plateView.gaugeView.value = (NSInteger)transferOutput.distance;
+        /**
+         如果知道两个音a和b的频率,两个音相距的音分值n可用下列公式计算(类似分贝定义式的形式,目的是为了使指数形式的物理单位线性化,使其化为对数):
+
+          n=1200 *log2(a/b) == 3986 *log10(a/b)
+         */
+        Float32 cents = log2(transferOutput.frequency/transferOutput.midFrequence) * 1200;
+
+        if (lround(transferOutput.frequency) == lround(transferOutput.midFrequence)) {
+            cents = 0;
+        }
+        if (cents > 50) {
+            cents = 50;
+        }
+        else if (cents < -50) {
+            cents = 50;
+        }
         
-        self.bodyView.distance = (NSInteger)transferOutput.distance;
+        self.plateView.gaugeView.value = (NSInteger)cents;
+        
+        self.bodyView.distance = (NSInteger)cents;
         
         // 调整频率后
         float rate = 0.0;
-        if (labs((int)transferOutput.distance) <= 3) {
+        if (labs((int)cents) <= 10) {
             self.bodyView.frequenceCorrect = YES;
-//            rate = 1;
         }
         else {
             self.bodyView.frequenceCorrect = NO;
-//            int distance = abs((int)transferOutput.distance) > 50 ? 50 : abs((int)transferOutput.distance);
-//            rate = (50.0 - distance) / 50;
         }
-        int distance = abs((int)transferOutput.distance) > 50 ? 50 : abs((int)transferOutput.distance);
+        int distance = abs((int)cents) > 50 ? 50 : abs((int)cents);
+        
         rate = (50.0 - distance) / 50;
         self.bodyView.rateFrequence = rate;
         if (self.isTransfer == NO) {
             
             self.bodyView.nomalPitch.text = output.pitch;
-            self.bodyView.pitchFrequenceLabel.text = [NSString stringWithFormat:@"%@%zd:%.0fHz", output.pitch, output.octave, output.frequency];
+            self.bodyView.pitchFrequenceLabel.text = [NSString stringWithFormat:@"%@%zd:%.0fHz", output.pitch, output.octave, output.midFrequence / 440 *self.A4Frequence];
             self.bodyView.preFrequence.text = [NSString stringWithFormat:@"%@%zd",output.prePitch, output.preOctave];
             self.bodyView.nextFrequence.text = [NSString stringWithFormat:@"%@%zd",output.nextPitch, output.nextOctave];
         }
@@ -224,7 +239,7 @@ static float correctTime = 0.5;
             self.bodyView.transferNomalPitch.text = transferOutput.pitch;
             self.bodyView.transferDesc.text = self.settingView.transferPicthDesc;
             self.bodyView.transferPitch.text = [NSString stringWithFormat:@"%@",transferOutput.transferPitch];
-            self.bodyView.pitchFrequenceLabel.text = [NSString stringWithFormat:@"%@%zd:%.0fHz", transferOutput.transferPitch, transferOutput.transferOctave, transferOutput.frequency];
+            self.bodyView.pitchFrequenceLabel.text = [NSString stringWithFormat:@"%@%zd:%.0fHz", transferOutput.transferPitch, transferOutput.transferOctave, transferOutput.midFrequence];
             self.bodyView.preFrequence.text = [NSString stringWithFormat:@"%@%zd",transferOutput.prePitch, transferOutput.preOctave];
             self.bodyView.nextFrequence.text = [NSString stringWithFormat:@"%@%zd",transferOutput.nextPitch, transferOutput.nextOctave];
         }

+ 7 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Widget/Model/TuningFunction/Tuner.swift

@@ -74,6 +74,10 @@ private let frequencies: [Float] = [
      The interpreted next pitch of the microphone audio.
      */
     @objc public fileprivate(set) var nextPitch: String = ""
+    /**
+     The frequance of the interpreted  mid pitch.
+     */
+    @objc public fileprivate(set) var midFrequence: Float = 0.0
     
     /**
      The octave of the interpreted  transfer pitch.
@@ -256,6 +260,8 @@ private let frequencies: [Float] = [
 
         output.nextOctave = (index+2) / 12
         output.nextPitch = String(format: "%@", flats[(index+2) % flats.count], sharps[(index+2) % sharps.count])
+        
+        output.midFrequence = frequencies[index+1]
         return output
     }
     
@@ -298,6 +304,7 @@ private let frequencies: [Float] = [
         
         newOutput.nextOctave = (index+2) / 12
         newOutput.nextPitch = String(format: "%@", flats[(index+2) % flats.count],sharps[(index+2) % sharps.count])
+        newOutput.midFrequence = frequencies[index+1] / 440 * A4Frequency
         // 移调之后的显示
         newOutput.transferOctave = (index+1) / 12
         newOutput.transferPitch = String(format: "%@", flats[(index+1) % flats.count],sharps[(index+1) % sharps.count])

+ 7 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Widget/View/KSGaugeView/KSGaugeView.m

@@ -305,7 +305,12 @@
     
     [self updateValue:value];
     double middleValue = lastValue + (((lastValue + (_value - lastValue) / 2.0) >= 0) ? (_value - lastValue) / 2.0 : (lastValue - _value) / 2.0);
-    
+    if (middleValue > 50) {
+        middleValue = 50;
+    }
+    else if (middleValue < -50) {
+        middleValue = -50;
+    }
     // Needle animation to target value
     // An intermediate "middle" value is used to make sure the needle will follow the right rotation direction
     
@@ -337,7 +342,7 @@
 
 - (void)setValue:(float)value
 {
-    [self setValue:value animated:YES];
+    [self setValue:value animated:NO];
 }
 
 /*