浏览代码

Merge branch 'vip_price_827'

yonge 3 年之前
父节点
当前提交
39f8b040c8

+ 43 - 10
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -32,6 +32,8 @@ public class UserChannelContext {
 	
 	private final static Logger LOGGER = LoggerFactory.getLogger(UserChannelContext3.class);
 	
+	private String user;
+	
 	private double standardFrequecy = 442;
 	
 	private int offsetMS;
@@ -73,6 +75,8 @@ public class UserChannelContext {
 	
 	private HardLevelEnum hardLevel = HardLevelEnum.ADVANCED;
 	
+	private boolean handlerSwitch;
+	
 	private NotePlayResult queryNoteFrequency(MusicXmlNote xmlNote, double playFrequency) {
 
 		NotePlayResult result = new NotePlayResult();
@@ -131,6 +135,10 @@ public class UserChannelContext {
 		return datas;
 	}
 	
+	public void setUser(String user) {
+		this.user = user;
+	}
+
 	public Long getRecordId() {
 		return recordId;
 	}
@@ -139,6 +147,14 @@ public class UserChannelContext {
 		this.recordId = recordId;
 	}
 
+	public boolean getHandlerSwitch() {
+		return handlerSwitch;
+	}
+
+	public void setHandlerSwitch(boolean handlerSwitch) {
+		this.handlerSwitch = handlerSwitch;
+	}
+
 	public int getOffsetMS() {
 		return offsetMS;
 	}
@@ -193,6 +209,7 @@ public class UserChannelContext {
 		receivedTime = 0;
 		delayProcessed = false;
 		dynamicOffset = 0;
+		handlerSwitch = false;
 	}
 	
 	public MusicXmlBasicInfo getMusicXmlBasicInfo(Integer songId){
@@ -220,7 +237,8 @@ public class UserChannelContext {
 		final int index = noteIndex;
 		MusicXmlBasicInfo musicXmlBasicInfo = getMusicXmlBasicInfo(songId);
 
-		if (musicXmlBasicInfo != null && index <= getTotalMusicNoteIndex(null)) {
+		int totalNoteIndex = getTotalMusicNoteIndex(null);
+		if (musicXmlBasicInfo != null && index <= totalNoteIndex) {
 			return musicXmlBasicInfo.getMusicXmlInfos().stream().filter(t -> t.getMusicalNotesIndex() == index).findFirst().get();
 		}
 
@@ -338,7 +356,7 @@ public class UserChannelContext {
 		
 		if (noteAnalysis.getMusicalNotesIndex() >= 0 && noteAnalysis.getMusicalNotesIndex() <= getTotalMusicNoteIndex(null)) {
 			
-			LOGGER.info("delayPrcessed:{} dynamicOffset:{}  Frequency:{}  splDb:{}  Power:{}  amplitude:{}  rms:{}  time:{}", delayProcessed, dynamicOffset, playFrequency, splDb, power, amplitude, rms, playTime);
+			LOGGER.info("user:{} dynamicOffset:{}  Frequency:{}  splDb:{}  Power:{}  amplitude:{}  rms:{}  time:{}", user, dynamicOffset, playFrequency, splDb, power, amplitude, rms, playTime);
 			
 			ChunkAnalysis chunkAnalysis = new ChunkAnalysis(playTime - durationTime, playTime, playFrequency, splDb, power, amplitude);
 			
@@ -655,14 +673,14 @@ public class UserChannelContext {
 		
 		//根据完整度取部分有效信号
 		int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
-		chunkAnalysisList = chunkAnalysisList.subList(0, elementSize);
+		List<ChunkAnalysis> chunkList = chunkAnalysisList.subList(0, elementSize);
 		
-		if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
+		if(chunkList == null || chunkList.size() == 0){
 			return false;
 		}
 		
 		if (musicXmlNote.getFrequency() == -1) {// 休止符
-			return chunkAnalysisList.stream().filter(t -> t.getFrequency() > 100).count() <= 1;
+			return chunkList.stream().filter(t -> t.getFrequency() > 100).count() <= 1;
 		}
 		
 		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
@@ -678,11 +696,11 @@ public class UserChannelContext {
 			lastChunkAnalysis = new ChunkAnalysis(0, 0, -1, 0, 0, 0);
 		}
 		
-		List<ChunkAnalysis> chunkList = new ArrayList<ChunkAnalysis>(chunkAnalysisList);
+		/*List<ChunkAnalysis> chunkList = new ArrayList<ChunkAnalysis>(chunkAnalysisList);
 		
 		if(chunkList.size() == 0){
 			return false;
-		}
+		}*/
 		
 		NoteFrequencyRange noteFrequencyRange = null;
 		ChunkAnalysis chunkAnalysis = null;
@@ -733,7 +751,9 @@ public class UserChannelContext {
 				//判断是否与上一个音延续下来的
 				if(firstChunkAnalysis.getFrequency() > 100 && lastChunkAnalysis.getFrequency() > 100){
 					tempo = new NoteFrequencyRange(standardFrequecy, firstChunkAnalysis.getFrequency()).equals(new NoteFrequencyRange(standardFrequecy, lastChunkAnalysis.getFrequency())) == false;
-					LOGGER.info("节奏错误原因:上一个音延续下来导致的");
+					if(tempo == false){
+						LOGGER.info("节奏错误原因:上一个音延续下来导致的");
+					}
 				}
 			}
 		}
@@ -750,11 +770,11 @@ public class UserChannelContext {
 		
 		List<ChunkAnalysis> chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(startTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(endTime)).collect(Collectors.toList());
 		
-		double correctedStartTime = queryFirstNoteStartTime(chunkAnalysisList, musicXmlNote);
+		/*double correctedStartTime = queryFirstNoteStartTime(chunkAnalysisList, musicXmlNote);
 		double correctedEndTime = correctedStartTime + musicXmlNote.getDuration();
 		
 		chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(correctedStartTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(correctedEndTime)).collect(Collectors.toList());
-		
+		*/
 		if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
 			return false;
 		}
@@ -827,6 +847,19 @@ public class UserChannelContext {
 		if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
 			return musicXmlNote.getTimeStamp() + dynamicOffset;
 		}
+		
+		//判断是否与上一个音是同一个音符
+		if(musicXmlNote.getMusicalNotesIndex() > 0){
+			MusicXmlNote preMusicXmlNote = getCurrentMusicNote(null, musicXmlNote.getMusicalNotesIndex() - 1);
+			if((int)preMusicXmlNote.getFrequency() == (int)musicXmlNote.getFrequency()){
+				Optional<ChunkAnalysis> optional = chunkAnalysisList.stream().filter(t -> t.getFrequency() <= 100).findFirst();
+				if(optional.isPresent()){
+					return optional.get().getEndTime();
+				}else{
+					return musicXmlNote.getTimeStamp() + dynamicOffset;
+				}
+			}
+		}
 
 		NoteFrequencyRange standardNote = new NoteFrequencyRange(standardFrequecy, musicXmlNote.getFrequency());
 

+ 1 - 1
audio-analysis/src/main/java/com/yonge/netty/server/NettyServer.java

@@ -53,7 +53,7 @@ public class NettyServer {
 
 	private EventLoopGroup bossGroup = new NioEventLoopGroup();
 
-	private EventLoopGroup workGroup = new NioEventLoopGroup();
+	private EventLoopGroup workGroup = new NioEventLoopGroup(5);
 
 	@Autowired
 	private NettyServerHandler nettyServerHandler;

+ 8 - 9
audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java

@@ -93,8 +93,6 @@ public class AudioCompareHandler implements MessageHandler {
 
 	private SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmSS");
 	
-	private boolean handlerSwitch = false;
-
 	@Override
 	public String getAction() {
 		return "SOUND_COMPARE";
@@ -113,8 +111,6 @@ public class AudioCompareHandler implements MessageHandler {
 
 		switch (command) {
 		case "musicXml": // 同步music xml信息
-			
-			handlerSwitch = false;
 
 			musicXmlBasicInfo = JSONObject.toJavaObject(dataObj, MusicXmlBasicInfo.class);
 
@@ -123,10 +119,13 @@ public class AudioCompareHandler implements MessageHandler {
 			if (channelContext == null) {
 				channelContext = new UserChannelContext();
 			}
+			
+			channelContext.setHandlerSwitch(false);
 
 			channelContext.getSongMusicXmlMap().put(musicXmlBasicInfo.getExamSongId(), musicXmlBasicInfo);
 			channelContext.init(musicXmlBasicInfo.getPlatform(), musicXmlBasicInfo.getHeardLevel(), musicXmlBasicInfo.getSubjectId(), musicXmlBasicInfo.getBeatLength());
-
+			channelContext.setUser(user);
+			
 			userChannelContextService.register(channel, channelContext);
 
 			break;
@@ -135,7 +134,7 @@ public class AudioCompareHandler implements MessageHandler {
 			// 清空缓存信息
 			channelContext.resetUserInfo();
 			
-			handlerSwitch = false;
+			channelContext.setHandlerSwitch(false);
 			
 			musicXmlBasicInfo = channelContext.getMusicXmlBasicInfo(null);
 
@@ -162,7 +161,7 @@ public class AudioCompareHandler implements MessageHandler {
 				return false;
 			}
 			
-			handlerSwitch = false;
+			channelContext.setHandlerSwitch(false);
 
 			WaveformWriter waveFileProcessor = channelContext.getWaveFileProcessor();
 			if (waveFileProcessor != null) {
@@ -237,7 +236,7 @@ public class AudioCompareHandler implements MessageHandler {
 			Integer offsetTime = dataObj.getInteger("offsetTime");
 			if(offsetTime != null){
 				channelContext.setOffsetMS(offsetTime);
-				handlerSwitch = true;
+				channelContext.setHandlerSwitch(true);
 			}
 
 			break;
@@ -291,7 +290,7 @@ public class AudioCompareHandler implements MessageHandler {
 
 		int totalLength = channelContext.getChannelBufferBytes().length;
 		
-		if (handlerSwitch == false) {
+		if (channelContext.getHandlerSwitch() == false) {
 			return false;
 		}