|
@@ -14,7 +14,7 @@
|
|
|
#import <CloudAccompanyLibrary/KSVideoRecordManager.h> // 视频录制
|
|
|
#import <CloudAccompanyLibrary/KSCloudBeatView.h> // 节拍器
|
|
|
#import <KSToolLibrary/MidiPlayerEngine.h> // midi 播放
|
|
|
-#import <CloudAccompanyLibrary/kSNewPlayer.h> // mp3 播放器
|
|
|
+//#import <CloudAccompanyLibrary/kSNewPlayer.h> // mp3 播放器
|
|
|
|
|
|
#import "AccompanyLoadingView.h"
|
|
|
|
|
@@ -27,7 +27,9 @@
|
|
|
#import <KSTunerLibrary/KSTunerLibrary-Swift.h>
|
|
|
#import "KSLogManager.h"
|
|
|
|
|
|
-@interface KSAccompanyWebViewController ()<KSAQRecordManagerDelegate,KSAudioSessionManagerDelegate,PlayerEngineDelegate,TunerDelegate,kSNewPlayerManagerDelegate>
|
|
|
+#import "AudioEnginePlayer.h"
|
|
|
+
|
|
|
+@interface KSAccompanyWebViewController ()<KSAQRecordManagerDelegate,KSAudioSessionManagerDelegate,PlayerEngineDelegate,TunerDelegate,AudioEnginePlayerDelegate>
|
|
|
|
|
|
@property (nonatomic, strong) KSAudioSessionManager *audioSessionManager;
|
|
|
|
|
@@ -84,12 +86,12 @@
|
|
|
// 延迟校准开始时发送 AdjustStart消息标识
|
|
|
@property (nonatomic, assign) BOOL isDelayCheckStart;
|
|
|
// 检测延迟播放器
|
|
|
-@property (nonatomic, strong) kSNewPlayer *dingPlayer;
|
|
|
-
|
|
|
-@property (nonatomic, strong) kSNewPlayer *dongPlayer;
|
|
|
+@property (nonatomic, strong) AudioEnginePlayer *delayCheckPlayer;
|
|
|
|
|
|
// 音频播放器
|
|
|
-@property (nonatomic, strong) kSNewPlayer *musicPlayer;
|
|
|
+@property (nonatomic, strong) AudioEnginePlayer *musicPlayer;
|
|
|
+
|
|
|
+@property (nonatomic, assign) float musicSpeed; //播放速度
|
|
|
// 录音开始时间
|
|
|
@property (nonatomic, assign) NSTimeInterval recordStartTime;
|
|
|
// 播放开始时间
|
|
@@ -97,9 +99,7 @@
|
|
|
// 播放延迟
|
|
|
@property (nonatomic, assign) NSInteger offsetTime;
|
|
|
|
|
|
-
|
|
|
-@property (nonatomic, assign) BOOL dingPlayerReady;
|
|
|
-@property (nonatomic, assign) BOOL dongPlayerReady;
|
|
|
+@property (nonatomic, assign) BOOL checkPlayerReady;
|
|
|
|
|
|
@property (nonatomic, assign) BOOL musicPlayerReady;
|
|
|
|
|
@@ -109,9 +109,7 @@
|
|
|
|
|
|
@property (nonatomic, assign) NSInteger checkIndex;
|
|
|
|
|
|
-@property (nonatomic, assign) NSInteger firstFrequence;
|
|
|
-
|
|
|
-@property (nonatomic, assign) NSInteger secondFrequence;
|
|
|
+@property (nonatomic, assign) NSInteger checkPrequence;
|
|
|
|
|
|
@property (nonatomic, strong) NSURL *bgAudioUrl;
|
|
|
|
|
@@ -123,6 +121,8 @@
|
|
|
|
|
|
@property (nonatomic, assign) NSInteger musicStartTime; // 开始播放的时间
|
|
|
|
|
|
+@property (nonatomic, assign) BOOL hasRecordMusicOffset; // 是否记录了播放延迟
|
|
|
+
|
|
|
@end
|
|
|
|
|
|
@implementation KSAccompanyWebViewController
|
|
@@ -165,10 +165,8 @@
|
|
|
|
|
|
- (void)resetPlayerConfig {
|
|
|
[self freeMp3Player]; // 若之前有播放器,剔除
|
|
|
- self.firstFrequence = 800;
|
|
|
- self.secondFrequence = 800;
|
|
|
- self.dingPlayerReady = NO;
|
|
|
- self.dongPlayerReady = NO;
|
|
|
+ self.checkPrequence = 800;
|
|
|
+ self.checkPlayerReady = NO;
|
|
|
self.musicPlayerReady = NO;
|
|
|
self.recordStartTime = 0;
|
|
|
self.playerStartTime = 0;
|
|
@@ -182,11 +180,13 @@
|
|
|
NSURL *fileUrl = [[NSURL alloc] initFileURLWithPath:filePath];
|
|
|
if ([self checkSongHasSaveAccompanyWithSongUrl:musicUrl]) {
|
|
|
[self configVideoRecord:fileUrl];
|
|
|
+ [self initMusicPlayer:fileUrl];
|
|
|
}
|
|
|
else {
|
|
|
MJWeakSelf;
|
|
|
[self downloadUrl:musicUrl success:^{
|
|
|
[weakSelf configVideoRecord:fileUrl];
|
|
|
+ [weakSelf initMusicPlayer:fileUrl];
|
|
|
} faliure:^{
|
|
|
|
|
|
}];
|
|
@@ -197,57 +197,57 @@
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-- (void)initMp3Player:(NSString *)musicUrl checkUrl:(NSString *)checkUrl {
|
|
|
- [self resetPlayerConfig];
|
|
|
- self.accompanyUrl = musicUrl;
|
|
|
- [self.musicPlayer preparePlaySongWithUrl:musicUrl];
|
|
|
- [self.dingPlayer preparePlaySongWithUrl:checkUrl];
|
|
|
- [self.dongPlayer preparePlaySongWithUrl:checkUrl];
|
|
|
+- (void)initMusicPlayer:(NSURL *)musicUrl {
|
|
|
|
|
|
- [self prepareMusic];
|
|
|
+ [self.musicPlayer prepareNativeSongWithUrl:musicUrl];
|
|
|
+}
|
|
|
+
|
|
|
+- (void)downloadCheckMusic:(NSString *)checkMusicUrl {
|
|
|
+ if (![NSString isEmptyString:checkMusicUrl]) {
|
|
|
+ NSString *fileName = [checkMusicUrl getUrlFileName];
|
|
|
+ NSString *filePath = [self getAccompanyFilePathWithName:fileName];
|
|
|
+ NSURL *fileUrl = [[NSURL alloc] initFileURLWithPath:filePath];
|
|
|
+ if ([self checkSongHasSaveAccompanyWithSongUrl:checkMusicUrl]) {
|
|
|
+ [self initCheckPlayer:fileUrl];
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ MJWeakSelf;
|
|
|
+ [self downloadUrl:checkMusicUrl success:^{
|
|
|
+ [weakSelf initCheckPlayer:fileUrl];
|
|
|
+ } faliure:^{
|
|
|
+
|
|
|
+ }];
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-- (void)prepareMusic {
|
|
|
+- (void)initCheckPlayer:(NSURL *)checkUrl {
|
|
|
+ [self.delayCheckPlayer prepareNativeSongWithUrl:checkUrl];
|
|
|
+}
|
|
|
+
|
|
|
+- (void)initMp3Player:(NSString *)musicUrl checkUrl:(NSString *)checkUrl {
|
|
|
|
|
|
- self.dingPlayer.isMute = YES;
|
|
|
- [self.dingPlayer startPlayNoSeek];
|
|
|
- self.dongPlayer.isMute = YES;
|
|
|
- [self.dongPlayer startPlayNoSeek];
|
|
|
- self.musicPlayer.isMute = YES;
|
|
|
- [self.musicPlayer startPlayNoSeek];
|
|
|
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
|
- [self.musicPlayer puasePlay];
|
|
|
- self.musicPlayer.isMute = NO;
|
|
|
- [self.dingPlayer puasePlay];
|
|
|
- self.dingPlayer.isMute = NO;
|
|
|
- [self.dongPlayer puasePlay];
|
|
|
- self.dongPlayer.isMute = NO;
|
|
|
- [self configPlayerDelegate];
|
|
|
- });
|
|
|
+ [self resetPlayerConfig];
|
|
|
+ self.accompanyUrl = musicUrl;
|
|
|
+ [self downloadCheckMusic:checkUrl];
|
|
|
}
|
|
|
|
|
|
- (void)freeMp3Player {
|
|
|
- if (_dingPlayer) {
|
|
|
- [self.dingPlayer freePlayer];
|
|
|
- }
|
|
|
- if (_dongPlayer) {
|
|
|
- [self.dongPlayer freePlayer];
|
|
|
- }
|
|
|
- if (_musicPlayer) {
|
|
|
- [self.musicPlayer freePlayer];
|
|
|
+ if (_delayCheckPlayer) {
|
|
|
+ [self.delayCheckPlayer freePlayer];
|
|
|
}
|
|
|
+ if (_musicPlayer) {
|
|
|
+ [self.musicPlayer freePlayer];
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- (void)stopMp3Player {
|
|
|
- if (_dingPlayer) {
|
|
|
- [self.dingPlayer puasePlay];
|
|
|
- }
|
|
|
- if (_dongPlayer) {
|
|
|
- [self.dongPlayer puasePlay];
|
|
|
- }
|
|
|
- if (_musicPlayer) {
|
|
|
- [self.musicPlayer puasePlay];
|
|
|
+ if (_delayCheckPlayer) {
|
|
|
+ [self.delayCheckPlayer stopPlay];
|
|
|
}
|
|
|
+ if (_musicPlayer) {
|
|
|
+ [self.musicPlayer stopPlay];
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
@@ -266,7 +266,9 @@
|
|
|
if ([type isEqualToString:@"DELAY_CHECK"] && [commond isEqualToString:@"recordEnd"]) {
|
|
|
NSDictionary *body = [result ks_dictionaryValueForKey:@"body"];
|
|
|
NSTimeInterval micDelay = [body ks_doubleValueForKey:@"firstNoteDelayDuration"] - self.offsetTime;
|
|
|
- [self.delayArray addObject:[NSNumber numberWithDouble:micDelay]];
|
|
|
+ if (micDelay > 0) {
|
|
|
+ [self.delayArray addObject:[NSNumber numberWithDouble:micDelay]];
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -554,6 +556,12 @@
|
|
|
else {
|
|
|
self.muteAccompany = NO;
|
|
|
}
|
|
|
+ if ([[content allKeys] containsObject:@"speedRate"]) { // 播放速度
|
|
|
+ self.musicSpeed = [content ks_floatValueForKey:@"speedRate"];
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ self.musicSpeed = 1.0f;
|
|
|
+ }
|
|
|
if (self->_videoRecordManager) {
|
|
|
[self.videoRecordManager clearVideoFile];
|
|
|
}
|
|
@@ -665,6 +673,12 @@
|
|
|
mergeView.recordId = [content ks_stringValueForKey:@"recordId"];
|
|
|
mergeView.songName = [content ks_stringValueForKey:@"title"];
|
|
|
mergeView.coverImage = [content ks_stringValueForKey:@"coverImg"];
|
|
|
+ // if ([[content allKeys] containsObject:@"speedRate"]) {
|
|
|
+ // mergeView.musicSpeed = [content ks_floatValueForKey:@"speedRate"];
|
|
|
+ // }
|
|
|
+ // else {
|
|
|
+ // mergeView.musicSpeed = 1.0f;
|
|
|
+ // }
|
|
|
MJWeakSelf;
|
|
|
NSInteger micDelay = [UserDefaultObjectForKey(@"micDelay") integerValue];
|
|
|
NSInteger defaultDelay = self.offsetTime + micDelay;
|
|
@@ -1273,18 +1287,14 @@
|
|
|
#pragma mark ------- 评测app播放
|
|
|
|
|
|
- (void)recordDidStart:(NSTimeInterval)time { // ms
|
|
|
+ self.hasRecordMusicOffset = NO;
|
|
|
self.recordStartTime = time;
|
|
|
if (self.isDelayCheckStart) {
|
|
|
NSLog(@"---- delay - record did start %f", time);
|
|
|
// 播放音频
|
|
|
// 播放校音音频
|
|
|
dispatch_main_sync_safe(^{
|
|
|
- if (self.checkIndex % 2 == 0) {
|
|
|
- [self.dongPlayer startPlay];
|
|
|
- }
|
|
|
- else {
|
|
|
- [self.dingPlayer startPlay];
|
|
|
- }
|
|
|
+ [self.delayCheckPlayer seekToTimePlay:0];
|
|
|
});
|
|
|
}
|
|
|
else if (self.isCompareStart) {
|
|
@@ -1292,7 +1302,8 @@
|
|
|
// 播放伴奏
|
|
|
dispatch_main_sync_safe(^{
|
|
|
self.musicPlayer.isMute = self.muteAccompany;
|
|
|
- [self.musicPlayer startPlay];
|
|
|
+ self.musicPlayer.rate = self.musicSpeed;
|
|
|
+ // 进度跳转
|
|
|
[self.musicPlayer seekToTimePlay:self.musicStartTime];
|
|
|
});
|
|
|
}
|
|
@@ -1335,13 +1346,7 @@
|
|
|
NSLog(@"--------- send delay check start message");
|
|
|
_isDelayCheckStart = NO;
|
|
|
NSString *checkStartMessage = @"recordStart";
|
|
|
- NSInteger frequence = 0.0f;
|
|
|
- if (self.checkIndex % 2 == 0) {
|
|
|
- frequence = self.secondFrequence;
|
|
|
- }
|
|
|
- else {
|
|
|
- frequence = self.firstFrequence;
|
|
|
- }
|
|
|
+ NSInteger frequence = self.checkPrequence;
|
|
|
NSDictionary *parm = @{@"HZ" : @(frequence)};
|
|
|
NSString *startString = [self configDataCommond:checkStartMessage body:parm type:@"DELAY_CHECK"];
|
|
|
[self sendDataToSocketService:startString];
|
|
@@ -1678,97 +1683,78 @@
|
|
|
return hasSaveFile;
|
|
|
}
|
|
|
|
|
|
-#pragma mark ---- player
|
|
|
-- (void)configPlayerDelegate {
|
|
|
- self.dingPlayer.delegate = self;
|
|
|
- self.dongPlayer.delegate = self;
|
|
|
- self.musicPlayer.delegate = self;
|
|
|
-}
|
|
|
-- (kSNewPlayer *)dingPlayer {
|
|
|
- if (!_dingPlayer) {
|
|
|
- _dingPlayer = [[kSNewPlayer alloc] init];
|
|
|
+#pragma mark ------- Audio Engine player
|
|
|
+- (AudioEnginePlayer *)delayCheckPlayer {
|
|
|
+ if (!_delayCheckPlayer) {
|
|
|
+ _delayCheckPlayer = [[AudioEnginePlayer alloc] init];
|
|
|
+ _delayCheckPlayer.delegate = self;
|
|
|
}
|
|
|
- return _dingPlayer;
|
|
|
+ return _delayCheckPlayer;
|
|
|
}
|
|
|
-
|
|
|
-- (kSNewPlayer *)dongPlayer {
|
|
|
- if (!_dongPlayer) {
|
|
|
- _dongPlayer = [[kSNewPlayer alloc] init];
|
|
|
+- (AudioEnginePlayer *)musicPlayer {
|
|
|
+ if (!_musicPlayer) {
|
|
|
+ _musicPlayer = [[AudioEnginePlayer alloc] init];
|
|
|
+ _musicPlayer.delegate = self;
|
|
|
}
|
|
|
- return _dongPlayer;
|
|
|
+ return _musicPlayer;
|
|
|
}
|
|
|
|
|
|
-- (kSNewPlayer *)musicPlayer {
|
|
|
- if (!_musicPlayer) {
|
|
|
- _musicPlayer = [[kSNewPlayer alloc] init];
|
|
|
+#pragma mark ---- Audio Engine player delegate
|
|
|
+- (void)enginePlayerIsReadyPlay:(AudioEnginePlayer *)player {
|
|
|
+ if (player == self.delayCheckPlayer) {
|
|
|
+ self.checkPlayerReady = YES;
|
|
|
+ }
|
|
|
+ else if (player == self.musicPlayer) {
|
|
|
+ self.musicPlayerReady = YES;
|
|
|
+ }
|
|
|
+ // 如果都准备好
|
|
|
+ if (self.musicPlayerReady && self.checkPlayerReady) {
|
|
|
+ [self sendPlayerReadyMsg];
|
|
|
}
|
|
|
- return _musicPlayer;
|
|
|
}
|
|
|
|
|
|
-#pragma mark ---- new player delegate
|
|
|
-- (void)getSongCurrentTime:(NSInteger)currentTime andTotalTime:(NSInteger)totalTime andProgress:(CGFloat)progress currentInterval:(NSTimeInterval)currentInterval playTime:(NSTimeInterval)playTime inPlayer:(kSNewPlayer *)player {
|
|
|
-
|
|
|
- if (player == self.dingPlayer || player == self.dongPlayer) {
|
|
|
- if (playTime >= 300 && playTime < 310 && self.recordStartTime > 0) {
|
|
|
- NSLog(@" --- check player start play time %f", currentInterval*1000 - playTime);
|
|
|
- self.playerStartTime = currentInterval*1000 - playTime;
|
|
|
+// 播放进度
|
|
|
+- (void)updatePlayProgress:(NSInteger)playTime andTotalTime:(NSInteger)totalTime andProgress:(CGFloat)progress currentInterval:(NSTimeInterval)currentInterval inPlayer:(AudioEnginePlayer *)player {
|
|
|
+ if (player == self.delayCheckPlayer) {
|
|
|
+ if (playTime >= 300 && self.recordStartTime > 0 && self.hasRecordMusicOffset == NO) {
|
|
|
+ self.hasRecordMusicOffset = YES;
|
|
|
+ NSLog(@" --- check player start play time %f", currentInterval - playTime);
|
|
|
+ self.playerStartTime = currentInterval - playTime;
|
|
|
self.offsetTime = self.playerStartTime - self.recordStartTime;
|
|
|
NSLog(@"--------- check player offset time -- %zd", self.offsetTime);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- if (playTime >= self.musicStartTime + 300 && playTime < self.musicStartTime + 310 && player == self.musicPlayer) {
|
|
|
+ // 如果未记录延迟
|
|
|
+ if (playTime >= (self.musicStartTime + 300) && player == self.musicPlayer && self.hasRecordMusicOffset == NO) {
|
|
|
if (self.recordStartTime > 0) {
|
|
|
- NSInteger newPlayTime = playTime - self.musicStartTime; // 选段
|
|
|
- NSLog(@" --- music player start play time %f", currentInterval*1000 - newPlayTime);
|
|
|
- self.playerStartTime = currentInterval*1000 - newPlayTime;
|
|
|
+ self.hasRecordMusicOffset = YES;
|
|
|
+ NSInteger newPlayTime = (playTime - self.musicStartTime) / player.rate; // 选段
|
|
|
+ NSLog(@" --- music player start play time %f", currentInterval - newPlayTime);
|
|
|
+ self.playerStartTime = currentInterval - newPlayTime;
|
|
|
self.offsetTime = self.playerStartTime - self.recordStartTime;
|
|
|
NSLog(@"--------- music play offset time -- %zd", self.offsetTime);
|
|
|
[self sendOffsetTimeToService];
|
|
|
}
|
|
|
NSLog(@"------- record start time %f", self.recordStartTime);
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
// 回调进度
|
|
|
if (player == self.musicPlayer) {
|
|
|
- // NSLog(@"------ music play progress - %f", progress);
|
|
|
- // 回调进度
|
|
|
- NSDictionary *parm = @{
|
|
|
- @"api" : @"playProgress",
|
|
|
- @"content" : @{@"currentTime" : [NSNumber numberWithInteger:currentTime],
|
|
|
- @"totalDuration" : [NSNumber numberWithInteger:totalTime],
|
|
|
- }
|
|
|
- };
|
|
|
- // NSLog(@" -----music play progress %@---- ", parm);
|
|
|
- [self postMessage:parm];
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-- (void)sendPlayerReadyMsg {
|
|
|
- if (self.playerParm) {
|
|
|
- [self postMessage:self.playerParm];
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-- (void)playerIsReadyPlay:(kSNewPlayer *)player {
|
|
|
- if (player == self.musicPlayer) {
|
|
|
- self.musicPlayerReady = YES;
|
|
|
- }
|
|
|
- else if (player == self.dingPlayer) {
|
|
|
- self.dingPlayerReady = YES;
|
|
|
-
|
|
|
- }
|
|
|
- else if (player == self.dongPlayer) {
|
|
|
- self.dongPlayerReady = YES;
|
|
|
- }
|
|
|
- // 如果都准备好
|
|
|
- if (self.musicPlayerReady && self.dingPlayerReady && self.dongPlayerReady) {
|
|
|
- [self sendPlayerReadyMsg];
|
|
|
+// NSLog(@"------ music play progress - %f", progress);
|
|
|
+ // 回调进度
|
|
|
+ NSDictionary *parm = @{
|
|
|
+ @"api" : @"playProgress",
|
|
|
+ @"content" : @{@"currentTime" : [NSNumber numberWithInteger:playTime],
|
|
|
+ @"totalDuration" : [NSNumber numberWithInteger:totalTime],
|
|
|
+ }
|
|
|
+ };
|
|
|
+ NSLog(@" -----music play progress %@---- ", parm);
|
|
|
+ [self postMessage:parm];
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
-
|
|
|
-- (void)playerDidError:(kSNewPlayer *)player {
|
|
|
+// 错误
|
|
|
+- (void)enginePlayerDidError:(AudioEnginePlayer *)player error:(NSError *)error {
|
|
|
[self stopRecordService];
|
|
|
[self stopMp3Player]; // 停止播放
|
|
|
// 播放出现问题
|
|
@@ -1777,7 +1763,6 @@
|
|
|
};
|
|
|
[self postMessage:postParm];
|
|
|
|
|
|
- NSError *error = player.player.error;
|
|
|
if (error) {
|
|
|
NSLog(@"-- error desc - %@", error.description);
|
|
|
NSMutableDictionary *parm = [NSMutableDictionary dictionary];
|
|
@@ -1796,10 +1781,16 @@
|
|
|
} faliure:^(NSError * _Nonnull error) {
|
|
|
|
|
|
}];
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+- (void)sendPlayerReadyMsg {
|
|
|
+ if (self.playerParm) {
|
|
|
+ [self postMessage:self.playerParm];
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
- (NSMutableArray *)delayArray {
|
|
|
if (!_delayArray) {
|
|
|
_delayArray = [NSMutableArray array];
|