Bläddra i källkod

Merge branch 'music_score'

Joburgess 4 år sedan
förälder
incheckning
ea7adb19d8

+ 29 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCompareHelper.java

@@ -4,6 +4,7 @@ import be.tarsos.dsp.AudioEvent;
 import be.tarsos.dsp.SilenceDetector;
 import be.tarsos.dsp.pitch.PitchDetectionHandler;
 import be.tarsos.dsp.pitch.PitchDetectionResult;
+import com.ym.mec.biz.dal.enums.DeviceTypeEnum;
 import com.ym.mec.biz.service.impl.SoundCompareHandler;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.util.CollectionUtils;
@@ -21,9 +22,15 @@ import java.util.Map;
  */
 public class SoundCompareHelper implements PitchDetectionHandler {
 
+    @ApiModelProperty(value = "设备类型")
+    private DeviceTypeEnum deviceType;
+
     @ApiModelProperty(value = "伴奏编号")
     private Integer musicScoreId;
 
+    @ApiModelProperty(value = "声部编号")
+    private Integer subjectId;
+
     @ApiModelProperty(value = "小节开始时间")
     private double measureStartTime = 0;
 
@@ -55,7 +62,7 @@ public class SoundCompareHelper implements PitchDetectionHandler {
 
     private List<MusicPitchDetailDto> musicXmlInfos;
 
-    private byte[] preDataArray = new byte[0];
+    private String clientId;
     /**
      * @describe 分贝检测器
      */
@@ -77,12 +84,20 @@ public class SoundCompareHelper implements PitchDetectionHandler {
         this.musicalNotePitchMap = musicalNotePitchMap;
     }
 
-    public byte[] getPreDataArray() {
-        return preDataArray;
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public DeviceTypeEnum getDeviceType() {
+        return deviceType;
     }
 
-    public void setPreDataArray(byte[] preDataArray) {
-        this.preDataArray = preDataArray;
+    public void setDeviceType(DeviceTypeEnum deviceType) {
+        this.deviceType = deviceType;
     }
 
     public int getOffsetTime() {
@@ -117,6 +132,14 @@ public class SoundCompareHelper implements PitchDetectionHandler {
         this.accessFile = accessFile;
     }
 
+    public String getClientId() {
+        return clientId;
+    }
+
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
     public double getMeasureStartTime() {
         return measureStartTime;
     }
@@ -169,7 +192,7 @@ public class SoundCompareHelper implements PitchDetectionHandler {
     public void handlePitch(PitchDetectionResult pitchDetectionResult, AudioEvent audioEvent) {
         int timeStamp = (int) (measureStartTime + audioEvent.getTimeStamp()*1000);
         float pitch = pitchDetectionResult.getPitch();
-        if(pitch>0 && offsetTime == -1){
+        if(offsetTime == -1 && !DeviceTypeEnum.IOS.equals(deviceType) && pitch>0){
             int preTimeStamp = CollectionUtils.isEmpty(recordMeasurePithInfo)?0:recordMeasurePithInfo.get(recordMeasurePithInfo.size()-1).getTimeStamp();
             offsetTime = timeStamp - (timeStamp - preTimeStamp)/2;
             for (Map.Entry<Integer, MusicPitchDetailDto> musicPitchDetailDtoEntry : measureEndTime.entrySet()) {

+ 22 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.biz.dal.enums.DeviceTypeEnum;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.math.BigDecimal;
@@ -38,6 +39,10 @@ public class SysMusicCompareRecord {
 	
 	/** 创建时间 */
 	private java.util.Date createTime;
+
+	private DeviceTypeEnum deviceType;
+
+	private String clientId;
 	
 	public void setId(Long id){
 		this.id = id;
@@ -54,7 +59,15 @@ public class SysMusicCompareRecord {
 	public Integer getUserId(){
 		return this.userId;
 	}
-			
+
+	public String getClientId() {
+		return clientId;
+	}
+
+	public void setClientId(String clientId) {
+		this.clientId = clientId;
+	}
+
 	public void setSysMusicScoreId(Integer sysMusicScoreId){
 		this.sysMusicScoreId = sysMusicScoreId;
 	}
@@ -111,6 +124,14 @@ public class SysMusicCompareRecord {
 		this.recordFilePath = recordFilePath;
 	}
 
+	public DeviceTypeEnum getDeviceType() {
+		return deviceType;
+	}
+
+	public void setDeviceType(DeviceTypeEnum deviceType) {
+		this.deviceType = deviceType;
+	}
+
 	public void setCreateTime(java.util.Date createTime){
 		this.createTime = createTime;
 	}

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/DeviceTypeEnum.java

@@ -0,0 +1,35 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum DeviceTypeEnum implements BaseEnum<String, DeviceTypeEnum> {
+	IOS("IOS", "苹果"),
+	ANDROID("ANDROID", "安卓"),
+	WEB("WEB", "浏览器");
+
+	private String code;
+
+	private String msg;
+
+	DeviceTypeEnum(String code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	@Override
+	public String getCode() {
+		return this.code;
+	}
+}

+ 7 - 6
mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java

@@ -53,7 +53,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         String phone = session.getPrincipal().getName().split(":")[1];
         LOGGER.info("{}上线", phone);
         WS_CLIENTS.put(phone, new WebSocketClientDetail(session, new Date()));
-        appMap.values().forEach(e->e.afterConnectionEstablished(session));
+        appMap.values().forEach(e->e.afterConnectionEstablished(session, phone));
         super.afterConnectionEstablished(session);
     }
 
@@ -72,15 +72,16 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
             tag = webSocketInfo.getHeader().get(SoundSocketService.TAG);
         }
         if(StringUtils.isNotBlank(tag)){
-            appMap.get(tag).receiveTextMessage(session, message);
+            appMap.get(tag).receiveTextMessage(session, phone, message);
         }else{
-            appMap.values().forEach(e->e.receiveTextMessage(session, message));
+            appMap.values().forEach(e->e.receiveTextMessage(session, phone, message));
         }
     }
 
     @Override
     protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) {
-        appMap.values().forEach(e->e.receiveBinaryMessage(session, message));
+        String phone = session.getPrincipal().getName().split(":")[1];
+        appMap.values().forEach(e->e.receiveBinaryMessage(session, phone, message));
     }
 
     @Override
@@ -94,7 +95,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         String phone = session.getPrincipal().getName().split(":")[1];
         session.close();
         LOGGER.info("发生了错误,移除客户端: {}", phone);
-        appMap.values().forEach(e->e.afterConnectionClosed(session));
+        appMap.values().forEach(e->e.afterConnectionClosed(session, phone));
         exception.printStackTrace();
         if(!WS_CLIENTS.containsKey(phone)){
             return;
@@ -107,7 +108,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         super.afterConnectionClosed(session, status);
         String phone = session.getPrincipal().getName().split(":")[1];
         LOGGER.info("{}离线", phone);
-        appMap.values().forEach(e->e.afterConnectionClosed(session));
+        appMap.values().forEach(e->e.afterConnectionClosed(session, phone));
         WS_CLIENTS.remove(phone);
     }
 

+ 6 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/WebSocketEventHandler.java

@@ -10,6 +10,8 @@ import org.springframework.web.socket.WebSocketSession;
  **/
 public interface WebSocketEventHandler {
 
+
+
     /**
      * @describe 连接成功
      * @author Joburgess
@@ -17,7 +19,7 @@ public interface WebSocketEventHandler {
      * @param session: 会话信息
      * @return void
      */
-    void afterConnectionEstablished(WebSocketSession session);
+    void afterConnectionEstablished(WebSocketSession session, String phone);
 
     /**
      * @describe 接受到文本信息
@@ -27,7 +29,7 @@ public interface WebSocketEventHandler {
      * @param message: 文本信息
      * @return void
      */
-    void receiveTextMessage(WebSocketSession session, TextMessage message);
+    void receiveTextMessage(WebSocketSession session, String phone, TextMessage message);
 
     /**
      * @describe 接收到二进制数据
@@ -37,7 +39,7 @@ public interface WebSocketEventHandler {
      * @param message: 二进制数据
      * @return void
      */
-    void receiveBinaryMessage(WebSocketSession session, BinaryMessage message);
+    void receiveBinaryMessage(WebSocketSession session, String phone, BinaryMessage message);
 
     /**
      * @describe 连接关闭
@@ -46,6 +48,6 @@ public interface WebSocketEventHandler {
      * @param session: 会话信息
      * @return void
      */
-    void afterConnectionClosed(WebSocketSession session);
+    void afterConnectionClosed(WebSocketSession session, String phone);
 
 }

+ 29 - 19
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java

@@ -7,10 +7,12 @@ import be.tarsos.dsp.util.PitchConverter;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.config.SoundCompareConfig;
+import com.ym.mec.biz.dal.dao.SysMusicScoreAccompanimentDao;
 import com.ym.mec.biz.dal.dto.MusicPitchDetailDto;
 import com.ym.mec.biz.dal.dto.SoundCompareHelper;
 import com.ym.mec.biz.dal.dto.WavHeader;
 import com.ym.mec.biz.dal.dto.WebSocketInfo;
+import com.ym.mec.biz.dal.enums.DeviceTypeEnum;
 import com.ym.mec.biz.handler.WebSocketHandler;
 import com.ym.mec.biz.service.SoundSocketService;
 import com.ym.mec.biz.service.SysMusicCompareRecordService;
@@ -21,6 +23,7 @@ import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.socket.BinaryMessage;
@@ -52,7 +55,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
 
     private final String tmpDir = FileUtils.getTempDirectoryPath() + "/soundCompare/";
     /**
-     * @describe 用户对应评分信息------------------------------------------------------------------------------
+     * @describe 用户对应评分信息
      */
     private Map<String, SoundCompareHelper> userSoundInfoMap = new ConcurrentHashMap<>();
     /**
@@ -62,6 +65,8 @@ public class SoundCompareHandler implements WebSocketEventHandler {
 
     @Autowired
     private SysMusicCompareRecordService sysMusicCompareRecordService;
+    @Autowired
+    private SysMusicScoreAccompanimentDao sysMusicScoreAccompanimentDao;
 
     public SoundCompareHandler() {
         WebSocketHandler.regist("SOUND_COMPARE", this);
@@ -72,13 +77,12 @@ public class SoundCompareHandler implements WebSocketEventHandler {
     }
 
     @Override
-    public void afterConnectionEstablished(WebSocketSession session) {
-        System.out.println("已登录:+++++++++++++++++++++++++++++++++++++++++++++++++++");
+    public void afterConnectionEstablished(WebSocketSession session, String phone) {
+
     }
 
     @Override
-    public void receiveTextMessage(WebSocketSession session, TextMessage message) {
-        String phone = session.getPrincipal().getName().split(":")[1];
+    public void receiveTextMessage(WebSocketSession session, String phone, TextMessage message) {
         WebSocketInfo webSocketInfo = JSON.parseObject(message.getPayload(), WebSocketInfo.class);
         JSONObject bodyObject = (JSONObject) webSocketInfo.getBody();
 
@@ -89,10 +93,18 @@ public class SoundCompareHandler implements WebSocketEventHandler {
         switch (commond){
             case SoundSocketService.MUSIC_XML:
                 userSoundInfoMap.put(phone, new SoundCompareHelper());
+                userSoundInfoMap.get(phone).setClientId(((OAuth2Authentication)session.getPrincipal()).getOAuth2Request().getClientId());
                 List<MusicPitchDetailDto> musicXmlInfos = JSON.parseArray(bodyObject.getString("musicXmlInfos"), MusicPitchDetailDto.class);
                 userSoundInfoMap.get(phone).setMusicXmlInfos(musicXmlInfos);
                 musicXmlInfos = musicXmlInfos.stream().filter(m->!m.getDontEvaluating()).collect(Collectors.toList());
                 userSoundInfoMap.get(phone).setMusicScoreId(bodyObject.getInteger("id"));
+                if(bodyObject.containsKey("platform")){
+                    userSoundInfoMap.get(phone).setDeviceType(DeviceTypeEnum.valueOf(bodyObject.getString("platform")));
+                }
+                List<Integer> subjectIds = sysMusicScoreAccompanimentDao.findSubjectByMusicScoreId(userSoundInfoMap.get(phone).getMusicScoreId(), null);
+                if(!CollectionUtils.isEmpty(subjectIds)){
+                    userSoundInfoMap.get(phone).setSubjectId(subjectIds.get(0));
+                }
                 userSoundInfoMap.get(phone).setMeasureXmlInfoMap(musicXmlInfos.stream().collect(Collectors.groupingBy(MusicPitchDetailDto::getMeasureIndex)));
                 musicXmlInfos.forEach(e->userSoundInfoMap.get(phone).getMusicalNotePitchMap().put(e.getMusicalNotesIndex(), e.getFrequency()));
                 for (Map.Entry<Integer, List<MusicPitchDetailDto>> userMeasureXmlInfoEntry : userSoundInfoMap.get(phone).getMeasureXmlInfoMap().entrySet()) {
@@ -142,10 +154,10 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                 createHeader(phone);
                 break;
             case SoundSocketService.PROXY_MESSAGE:
-//                if(bodyObject.containsKey(SoundSocketService.OFFSET_TIME)){
-//                    int offsetTime = bodyObject.getIntValue(SoundSocketService.OFFSET_TIME);
-//                    calOffsetTime(phone, offsetTime);
-//                }
+                if(DeviceTypeEnum.IOS.equals(userSoundInfoMap.get(phone).getDeviceType())&&bodyObject.containsKey(SoundSocketService.OFFSET_TIME)){
+                    int offsetTime = bodyObject.getIntValue(SoundSocketService.OFFSET_TIME);
+                    calOffsetTime(phone, offsetTime);
+                }
                 break;
             default:
                 break;
@@ -153,8 +165,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
     }
 
     @Override
-    public void receiveBinaryMessage(WebSocketSession session, BinaryMessage message) {
-        String phone = session.getPrincipal().getName().split(":")[1];
+    public void receiveBinaryMessage(WebSocketSession session, String phone, BinaryMessage message) {
         if(!userSoundInfoMap.containsKey(phone)){
             return;
         }
@@ -191,9 +202,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
     }
 
     @Override
-    public void afterConnectionClosed(WebSocketSession session){
-        String phone = session.getPrincipal().getName().split(":")[1];
-        LOGGER.info("发生了错误,移除客户端: {}", phone);
+    public void afterConnectionClosed(WebSocketSession session, String phone){
         createHeader(phone);
         userSoundInfoMap.remove(phone);
     }
@@ -439,7 +448,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
      * @param phone:
      * @return void
      */
-    private void calTotalScore(String phone) throws IOException {
+    private void calTotalScore(String phone) {
         int totalCompareNum = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().keySet().size();
         int currentCompareNum = totalCompareNum-userSoundInfoMap.get(phone).getMeasureEndTime().keySet().size();
         BigDecimal intonation = BigDecimal.ZERO;
@@ -478,10 +487,11 @@ public class SoundCompareHandler implements WebSocketEventHandler {
         HashMap<String, String> header = new HashMap<>();
         header.put("commond", command);
         webSocketInfo.setHeader(header);
-        Map<String, Object> result = new HashMap<>();
-//        BigDecimal score = intonation.multiply(new BigDecimal(0.5)).add(cadence.multiply(new BigDecimal(0.5))).setScale(0, BigDecimal.ROUND_HALF_UP);
-        BigDecimal score = intonation.add(cadence).add(integrity).divide(new BigDecimal(3), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).setScale(0, BigDecimal.ROUND_UP);
-//        BigDecimal score = integrity.setScale(0, BigDecimal.ROUND_HALF_UP);
+        Map<String, Object> result = new HashMap<>(5);
+        BigDecimal score = cadence;
+        if(Objects.isNull(userSoundInfoMap.get(phone).getSubjectId())||userSoundInfoMap.get(phone).getSubjectId()!=23){
+            score = intonation.add(cadence).add(integrity).divide(new BigDecimal(3), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).setScale(0, BigDecimal.ROUND_UP);
+        }
         result.put("score", score);
         result.put("intonation", intonation);
         result.put("cadence", cadence);

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -47,6 +47,8 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 			sysMusicCompareRecord.setIntegrity((BigDecimal) finalScore.get("integrity"));
 		}
 		sysMusicCompareRecord.setRecordFilePath(soundCompareInfo.getRecordFilePath());
+		sysMusicCompareRecord.setDeviceType(soundCompareInfo.getDeviceType());
+		sysMusicCompareRecord.setClientId(soundCompareInfo.getClientId());
 		sysMusicCompareRecordDao.insert(sysMusicCompareRecord);
 	}
 }

+ 8 - 4
mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -16,6 +16,8 @@
 		<result column="cadence_" property="cadence" />
 		<result column="integrity_" property="integrity" />
 		<result column="record_file_path_" property="recordFilePath" />
+		<result column="device_type_" property="deviceType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
+		<result column="client_id_" property="clientId" />
 		<result column="create_time_" property="createTime" />
 	</resultMap>
 
@@ -36,8 +38,10 @@
 		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
 		</selectKey>
 		-->
-		INSERT INTO sys_music_compare_record (id_,user_id_,sys_music_score_id_,score_data_,score_,intonation_,cadence_,integrity_,record_file_path_,create_time_)
-		VALUES(#{id},#{userId},#{sysMusicScoreId},#{scoreData},#{score},#{intonation},#{cadence},#{integrity},#{recordFilePath},NOW())
+		INSERT INTO sys_music_compare_record (id_,user_id_,sys_music_score_id_,score_data_,score_,intonation_,cadence_,integrity_,
+		                                      record_file_path_,device_type_,client_id_,create_time_)
+		VALUES(#{id},#{userId},#{sysMusicScoreId},#{scoreData},#{score},#{intonation},#{cadence},#{integrity},
+		       #{recordFilePath},#{deviceType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{clientId},NOW())
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -70,8 +74,8 @@
 		<if test="recordFilePath != null">
 			record_file_path_ = #{recordFilePath},
 		</if>
-		<if test="createTime != null">
-			create_time_ = #{createTime},
+		<if test="clientId != null">
+			client_id_ = #{clientId},
 		</if>
 	</set> WHERE id_ = #{id}
 	</update>