|
@@ -21,7 +21,11 @@
|
|
#define KSMidiSongFileKey (@"KSDownloadMidiSong")
|
|
#define KSMidiSongFileKey (@"KSDownloadMidiSong")
|
|
#import "KulexiuForStudent-swift.h"
|
|
#import "KulexiuForStudent-swift.h"
|
|
|
|
|
|
-@interface KSAccompanyWebViewController ()<KSAQRecordManagerDelegate,KSAudioSessionManagerDelegate,PlayerEngineDelegate,TunerDelegate>
|
|
|
|
|
|
+#import "kSNewPlayer.h"
|
|
|
|
+#import "KSMediaEditor.h"
|
|
|
|
+#import "KSMediaMergeView.h"
|
|
|
|
+
|
|
|
|
+@interface KSAccompanyWebViewController ()<KSAQRecordManagerDelegate,KSAudioSessionManagerDelegate,PlayerEngineDelegate,TunerDelegate,kSNewPlayerManagerDelegate>
|
|
|
|
|
|
@property (nonatomic, strong) KSAudioSessionManager *audioSessionManager;
|
|
@property (nonatomic, strong) KSAudioSessionManager *audioSessionManager;
|
|
|
|
|
|
@@ -75,6 +79,44 @@
|
|
|
|
|
|
@property (nonatomic, strong) Tuner *tuner;
|
|
@property (nonatomic, strong) Tuner *tuner;
|
|
|
|
|
|
|
|
+// 延迟校准开始时发送 AdjustStart消息标识
|
|
|
|
+@property (nonatomic, assign) BOOL isDelayCheckStart;
|
|
|
|
+// 检测延迟播放器
|
|
|
|
+@property (nonatomic, strong) kSNewPlayer *dingPlayer;
|
|
|
|
+
|
|
|
|
+@property (nonatomic, strong) kSNewPlayer *dongPlayer;
|
|
|
|
+
|
|
|
|
+// 音频播放器
|
|
|
|
+@property (nonatomic, strong) kSNewPlayer *musicPlayer;
|
|
|
|
+// 录音开始时间
|
|
|
|
+@property (nonatomic, assign) NSTimeInterval recordStartTime;
|
|
|
|
+// 播放开始时间
|
|
|
|
+@property (nonatomic, assign) NSTimeInterval playerStartTime;
|
|
|
|
+// 播放延迟
|
|
|
|
+@property (nonatomic, assign) NSInteger offsetTime;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+@property (nonatomic, assign) BOOL dingPlayerReady;
|
|
|
|
+@property (nonatomic, assign) BOOL dongPlayerReady;
|
|
|
|
+
|
|
|
|
+@property (nonatomic, assign) BOOL musicPlayerReady;
|
|
|
|
+
|
|
|
|
+@property (nonatomic, strong) NSDictionary *playerParm;
|
|
|
|
+
|
|
|
|
+@property (nonatomic, strong) NSMutableArray *delayArray;
|
|
|
|
+
|
|
|
|
+@property (nonatomic, assign) NSInteger checkIndex;
|
|
|
|
+
|
|
|
|
+@property (nonatomic, assign) NSInteger firstFrequence;
|
|
|
|
+
|
|
|
|
+@property (nonatomic, assign) NSInteger secondFrequence;
|
|
|
|
+
|
|
|
|
+@property (nonatomic, strong) NSURL *bgAudioUrl;
|
|
|
|
+
|
|
|
|
+@property (nonatomic, strong) NSURL *recordUrl;
|
|
|
|
+
|
|
|
|
+@property (nonatomic, strong) NSString *accompanyUrl;
|
|
|
|
+
|
|
@end
|
|
@end
|
|
|
|
|
|
@implementation KSAccompanyWebViewController
|
|
@implementation KSAccompanyWebViewController
|
|
@@ -112,6 +154,72 @@
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+- (void)resetPlayerConfig {
|
|
|
|
+ [self freeMp3Player]; // 若之前有播放器,剔除
|
|
|
|
+ self.firstFrequence = 800;
|
|
|
|
+ self.secondFrequence = 800;
|
|
|
|
+ self.dingPlayerReady = NO;
|
|
|
|
+ self.dongPlayerReady = NO;
|
|
|
|
+ self.musicPlayerReady = NO;
|
|
|
|
+ self.recordStartTime = 0;
|
|
|
|
+ self.playerStartTime = 0;
|
|
|
|
+ self.offsetTime = 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (void)initMp3Player:(NSString *)musicUrl checkUrl:(NSString *)checkUrl {
|
|
|
|
+ [self resetPlayerConfig];
|
|
|
|
+ self.accompanyUrl = musicUrl;
|
|
|
|
+ [self.musicPlayer preparePlaySongWithUrl:musicUrl];
|
|
|
|
+ [self.dingPlayer preparePlaySongWithUrl:checkUrl];
|
|
|
|
+ [self.dongPlayer preparePlaySongWithUrl:checkUrl];
|
|
|
|
+
|
|
|
|
+ [self prepareMusic];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (void)prepareMusic {
|
|
|
|
+
|
|
|
|
+ self.dingPlayer.isMute = YES;
|
|
|
|
+ [self.dingPlayer startPlay];
|
|
|
|
+ self.dongPlayer.isMute = YES;
|
|
|
|
+ [self.dongPlayer startPlay];
|
|
|
|
+ self.musicPlayer.isMute = YES;
|
|
|
|
+ [self.musicPlayer startPlay];
|
|
|
|
+ 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];
|
|
|
|
+ });
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (void)freeMp3Player {
|
|
|
|
+ if (_dingPlayer) {
|
|
|
|
+ [self.dingPlayer freePlayer];
|
|
|
|
+ }
|
|
|
|
+ if (_dongPlayer) {
|
|
|
|
+ [self.dongPlayer freePlayer];
|
|
|
|
+ }
|
|
|
|
+ if (_musicPlayer) {
|
|
|
|
+ [self.musicPlayer freePlayer];
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (void)stopMp3Player {
|
|
|
|
+ if (_dingPlayer) {
|
|
|
|
+ [self.dingPlayer puasePlay];
|
|
|
|
+ }
|
|
|
|
+ if (_dongPlayer) {
|
|
|
|
+ [self.dongPlayer puasePlay];
|
|
|
|
+ }
|
|
|
|
+ if (_musicPlayer) {
|
|
|
|
+ [self.musicPlayer puasePlay];
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
- (void)viewDidLoad {
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
[super viewDidLoad];
|
|
// Do any additional setup after loading the view.
|
|
// Do any additional setup after loading the view.
|
|
@@ -120,11 +228,23 @@
|
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appEnterForeground) name:@"appEnterForeground" object:nil];
|
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appEnterForeground) name:@"appEnterForeground" object:nil];
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+- (void)checkMessage:(id)message {
|
|
|
|
+ NSDictionary *result = [message mj_JSONObject];
|
|
|
|
+ NSString *type = [[result ks_dictionaryValueForKey:@"header"] ks_stringValueForKey:@"type"];
|
|
|
|
+ NSString *commond = [[result ks_dictionaryValueForKey:@"header"] ks_stringValueForKey:@"commond"];
|
|
|
|
+ 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]];
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
- (void)connectSocketService {
|
|
- (void)connectSocketService {
|
|
|
|
|
|
MJWeakSelf;
|
|
MJWeakSelf;
|
|
self.socketManager.didReceiveMessage = ^(id _Nonnull message) {
|
|
self.socketManager.didReceiveMessage = ^(id _Nonnull message) {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
+ [weakSelf checkMessage:message];
|
|
// api
|
|
// api
|
|
NSMutableDictionary *sendMessage = [NSMutableDictionary dictionary];
|
|
NSMutableDictionary *sendMessage = [NSMutableDictionary dictionary];
|
|
[sendMessage setValue:@"sendResult" forKey:@"api"];
|
|
[sendMessage setValue:@"sendResult" forKey:@"api"];
|
|
@@ -137,7 +257,7 @@
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
|
if (!isSuccess) {
|
|
if (!isSuccess) {
|
|
- NSLog(@"-----连接失败");
|
|
|
|
|
|
+ // NSLog(@"-----连接失败");
|
|
if (weakSelf.hasSendStartMessage) {
|
|
if (weakSelf.hasSendStartMessage) {
|
|
if (weakSelf.AQManager.isRunning) {
|
|
if (weakSelf.AQManager.isRunning) {
|
|
NSDictionary *postParm = @{@"api" : @"cancelEvaluating",
|
|
NSDictionary *postParm = @{@"api" : @"cancelEvaluating",
|
|
@@ -147,19 +267,19 @@
|
|
[weakSelf stopRecordService];
|
|
[weakSelf stopRecordService];
|
|
weakSelf.isCompareStart = NO;
|
|
weakSelf.isCompareStart = NO;
|
|
weakSelf.isSoundCheckStart = NO;
|
|
weakSelf.isSoundCheckStart = NO;
|
|
|
|
+ weakSelf.isDelayCheckStart = NO;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (weakSelf.evaluatParm) {
|
|
else if (weakSelf.evaluatParm) {
|
|
NSMutableDictionary *sendParm = [NSMutableDictionary dictionaryWithDictionary:weakSelf.evaluatParm];
|
|
NSMutableDictionary *sendParm = [NSMutableDictionary dictionaryWithDictionary:weakSelf.evaluatParm];
|
|
- NSLog(@"%@",sendParm);
|
|
|
|
NSDictionary *valueDic = [weakSelf.evaluatParm ks_dictionaryValueForKey:@"content"];
|
|
NSDictionary *valueDic = [weakSelf.evaluatParm ks_dictionaryValueForKey:@"content"];
|
|
[valueDic setValue:@"服务异常,请重试" forKey:@"reson"];
|
|
[valueDic setValue:@"服务异常,请重试" forKey:@"reson"];
|
|
- NSLog(@"%@",valueDic);
|
|
|
|
[sendParm setValue:valueDic forKey:@"content"];
|
|
[sendParm setValue:valueDic forKey:@"content"];
|
|
[weakSelf postMessage:sendParm];
|
|
[weakSelf postMessage:sendParm];
|
|
weakSelf.hasSendStartMessage = YES;
|
|
weakSelf.hasSendStartMessage = YES;
|
|
weakSelf.isCompareStart = NO;
|
|
weakSelf.isCompareStart = NO;
|
|
weakSelf.isSoundCheckStart = NO;
|
|
weakSelf.isSoundCheckStart = NO;
|
|
|
|
+ weakSelf.isDelayCheckStart = NO;
|
|
}
|
|
}
|
|
else { // 其他断开
|
|
else { // 其他断开
|
|
if (weakSelf.AQManager.isRunning) {
|
|
if (weakSelf.AQManager.isRunning) {
|
|
@@ -170,19 +290,19 @@
|
|
[weakSelf stopRecordService];
|
|
[weakSelf stopRecordService];
|
|
weakSelf.isCompareStart = NO;
|
|
weakSelf.isCompareStart = NO;
|
|
weakSelf.isSoundCheckStart = NO;
|
|
weakSelf.isSoundCheckStart = NO;
|
|
|
|
+ weakSelf.isDelayCheckStart = NO;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
- NSLog(@"-----连接成功");
|
|
|
|
|
|
+ // NSLog(@"-----连接成功");
|
|
if (weakSelf.hasSendStartMessage == NO && weakSelf.evaluatParm) {
|
|
if (weakSelf.hasSendStartMessage == NO && weakSelf.evaluatParm) {
|
|
NSDictionary *content = [weakSelf.evaluatParm ks_dictionaryValueForKey:@"content"];
|
|
NSDictionary *content = [weakSelf.evaluatParm ks_dictionaryValueForKey:@"content"];
|
|
NSString *sendData = [weakSelf configDataCommond:@"musicXml" body:content type:@"SOUND_COMPARE"];
|
|
NSString *sendData = [weakSelf configDataCommond:@"musicXml" body:content type:@"SOUND_COMPARE"];
|
|
[weakSelf sendDataToSocketService:sendData];
|
|
[weakSelf sendDataToSocketService:sendData];
|
|
[weakSelf postMessage:weakSelf.evaluatParm];
|
|
[weakSelf postMessage:weakSelf.evaluatParm];
|
|
weakSelf.hasSendStartMessage = YES;
|
|
weakSelf.hasSendStartMessage = YES;
|
|
- NSLog(@"---- send musicXML message");
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
}
|
|
}
|
|
});
|
|
});
|
|
};
|
|
};
|
|
@@ -217,11 +337,11 @@
|
|
config.selectionGranularity = WKSelectionGranularityDynamic;
|
|
config.selectionGranularity = WKSelectionGranularityDynamic;
|
|
config.allowsInlineMediaPlayback = YES;
|
|
config.allowsInlineMediaPlayback = YES;
|
|
config.mediaTypesRequiringUserActionForPlayback = NO;
|
|
config.mediaTypesRequiringUserActionForPlayback = NO;
|
|
-
|
|
|
|
|
|
+
|
|
config.processPool = [KSBaseWKWebViewController singleWkProcessPool];
|
|
config.processPool = [KSBaseWKWebViewController singleWkProcessPool];
|
|
config.websiteDataStore = [WKWebsiteDataStore defaultDataStore];
|
|
config.websiteDataStore = [WKWebsiteDataStore defaultDataStore];
|
|
[self configUserAgent:config];
|
|
[self configUserAgent:config];
|
|
-
|
|
|
|
|
|
+
|
|
//自定义的WKScriptMessageHandler 是为了解决内存不释放的问题
|
|
//自定义的WKScriptMessageHandler 是为了解决内存不释放的问题
|
|
WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
|
|
WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
|
|
//这个类主要用来做native与JavaScript的交互管理
|
|
//这个类主要用来做native与JavaScript的交互管理
|
|
@@ -250,11 +370,8 @@
|
|
make.top.mas_equalTo(self.view.mas_top);
|
|
make.top.mas_equalTo(self.view.mas_top);
|
|
make.bottom.mas_equalTo(self.view.mas_bottom);
|
|
make.bottom.mas_equalTo(self.view.mas_bottom);
|
|
}];
|
|
}];
|
|
- if (@available(iOS 11.0, *)) {
|
|
|
|
- self.myWebView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
|
|
|
|
- } else {
|
|
|
|
- // Fallback on earlier versions
|
|
|
|
- }
|
|
|
|
|
|
+ self.myWebView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
|
|
|
|
+
|
|
[self setupProgress];
|
|
[self setupProgress];
|
|
|
|
|
|
[self loadRequest];
|
|
[self loadRequest];
|
|
@@ -303,6 +420,10 @@
|
|
self.playerEngine = nil;
|
|
self.playerEngine = nil;
|
|
}
|
|
}
|
|
[self stopTuner];
|
|
[self stopTuner];
|
|
|
|
+ BOOL isBack = [self isViewPopDismiss];
|
|
|
|
+ if (isBack) {
|
|
|
|
+ [self freeMp3Player];
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
- (void)sendDataToSocketService:(id)data {
|
|
- (void)sendDataToSocketService:(id)data {
|
|
@@ -320,53 +441,64 @@
|
|
NSLog(@"---- receive parm %@", [parm mj_JSONString]);
|
|
NSLog(@"---- receive parm %@", [parm mj_JSONString]);
|
|
// 回到主线程
|
|
// 回到主线程
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
- if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"startEvaluating"]) { // 开始评测
|
|
|
|
- [self configRecordManager];
|
|
|
|
- self.hasSendStartMessage = NO;
|
|
|
|
- PREMISSIONTYPE isOk = [RecordCheckManager checkPermissionShowAlert:NO showInView:nil];
|
|
|
|
- if (isOk == PREMISSIONTYPE_YES) {
|
|
|
|
- self.evaluatParm = [NSMutableDictionary dictionaryWithDictionary:parm];
|
|
|
|
- // 如果socket 连上了
|
|
|
|
- if (self.socketManager.socketReadyState == SR_OPEN) {
|
|
|
|
- NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
|
|
- NSString *sendData = [self configDataCommond:@"musicXml" body:content type:@"SOUND_COMPARE"];
|
|
|
|
- [self sendDataToSocketService:sendData];
|
|
|
|
- [self postMessage:parm];
|
|
|
|
- self.hasSendStartMessage = YES;
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- [self connectSocketService];
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- NSDictionary *postParm = @{@"api" : @"cancelEvaluating",
|
|
|
|
- @"content" : @{@"reson":@"没有麦克风权限"}
|
|
|
|
- };
|
|
|
|
- [self postMessage:postParm];
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"createMusicPlayer"]) {
|
|
|
|
+ NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
|
|
+ NSString *musicUrl = [content ks_stringValueForKey:@"musicSrc"];
|
|
|
|
+ NSString *checkUrl = [content ks_stringValueForKey:@"tuneSrc"];
|
|
|
|
+ self.playerParm = parm;
|
|
|
|
+ [self initMp3Player:musicUrl checkUrl:checkUrl];
|
|
|
|
+ }
|
|
|
|
+ else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"startEvaluating"]) { // 开始评测
|
|
|
|
+ [self configRecordManager];
|
|
|
|
+ self.hasSendStartMessage = NO;
|
|
|
|
+ PREMISSIONTYPE isOk = [RecordCheckManager checkPermissionShowAlert:NO showInView:nil];
|
|
|
|
+ if (isOk == PREMISSIONTYPE_YES) {
|
|
|
|
+ self.evaluatParm = [NSMutableDictionary dictionaryWithDictionary:parm];
|
|
|
|
+ // 如果socket 连上了
|
|
|
|
+ if (self.socketManager.socketReadyState == SR_OPEN) {
|
|
|
|
+ NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
|
|
+ NSString *sendData = [self configDataCommond:@"musicXml" body:content type:@"SOUND_COMPARE"];
|
|
|
|
+ [self sendDataToSocketService:sendData];
|
|
|
|
+ [self postMessage:parm];
|
|
|
|
+ self.hasSendStartMessage = YES;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ [self connectSocketService];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ NSDictionary *postParm = @{@"api" : @"cancelEvaluating",
|
|
|
|
+ @"content" : @{@"reson":@"没有麦克风权限"}
|
|
|
|
+ };
|
|
|
|
+ [self postMessage:postParm];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"endEvaluating"]) {// 停止评测
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"endEvaluating"]) {// 停止评测
|
|
- self.evaluatParm = nil;
|
|
|
|
- [self stopRecordService];
|
|
|
|
- [self postMessage:parm];
|
|
|
|
- [self sendEndMessage];
|
|
|
|
|
|
+ self.evaluatParm = nil;
|
|
|
|
+ [self stopRecordService];
|
|
|
|
+ [self postMessage:parm];
|
|
|
|
+ [self sendEndMessage];
|
|
|
|
+ [self stopMp3Player]; // 停止播放
|
|
}
|
|
}
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cancelEvaluating"]) { // 取消评测
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cancelEvaluating"]) { // 取消评测
|
|
- self.evaluatParm = nil;
|
|
|
|
- [self stopRecordService];
|
|
|
|
- [self postMessage:parm];
|
|
|
|
- [self sendEndMessage];
|
|
|
|
|
|
+ self.evaluatParm = nil;
|
|
|
|
+ [self stopRecordService];
|
|
|
|
+ [self postMessage:parm];
|
|
|
|
+ [self sendEndMessage];
|
|
|
|
+ [self stopMp3Player]; // 停止播放
|
|
}
|
|
}
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"startRecording"]) { // 开始录制
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"startRecording"]) { // 开始录制
|
|
-// self.recordParm = [NSMutableDictionary dictionaryWithDictionary:parm];
|
|
|
|
- [self postMessage:parm];
|
|
|
|
- self.isCompareStart = YES;
|
|
|
|
- [self startRecordService];
|
|
|
|
|
|
+ if (self.videoRecordManager) {
|
|
|
|
+ [self.videoRecordManager clearVideoFile];
|
|
|
|
+ }
|
|
|
|
+ [self postMessage:parm];
|
|
|
|
+ self.isCompareStart = YES;
|
|
|
|
+ [self startRecordService];
|
|
}
|
|
}
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"endRecording"]) { // 停止录音
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"endRecording"]) { // 停止录音
|
|
- self.recordParm = nil;
|
|
|
|
- [self stopRecordService];
|
|
|
|
- [self postMessage:parm];
|
|
|
|
|
|
+ self.recordParm = nil;
|
|
|
|
+ [self stopRecordService];
|
|
|
|
+ [self postMessage:parm];
|
|
}
|
|
}
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"pauseRecording"]) {
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"pauseRecording"]) {
|
|
[self puaseRecordService];
|
|
[self puaseRecordService];
|
|
@@ -381,13 +513,13 @@
|
|
}
|
|
}
|
|
// 发送消息给socket service
|
|
// 发送消息给socket service
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"proxyMessage"]) {
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"proxyMessage"]) {
|
|
- [self sendMessageToSocket:parm];
|
|
|
|
|
|
+ [self sendMessageToSocket:parm];
|
|
}
|
|
}
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"proxyServiceMessage"]) {
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"proxyServiceMessage"]) {
|
|
- NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
|
|
- NSString *sendData = [content mj_JSONString];
|
|
|
|
- NSLog(@"proxyServiceMessage ------- %@",sendData);
|
|
|
|
- [self sendDataToSocketService:sendData];
|
|
|
|
|
|
+ NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
|
|
+ NSString *sendData = [content mj_JSONString];
|
|
|
|
+ NSLog(@"proxyServiceMessage ------- %@",sendData);
|
|
|
|
+ [self sendDataToSocketService:sendData];
|
|
}
|
|
}
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"openCamera"]) { // 开启摄像头
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"openCamera"]) { // 开启摄像头
|
|
PREMISSIONTYPE canOpenCamera = [RecordCheckManager checkCameraPremissionAvaiable:NO showInView:nil];
|
|
PREMISSIONTYPE canOpenCamera = [RecordCheckManager checkCameraPremissionAvaiable:NO showInView:nil];
|
|
@@ -438,6 +570,7 @@
|
|
[self postMessage:parm];
|
|
[self postMessage:parm];
|
|
self.isCompareStart = NO;
|
|
self.isCompareStart = NO;
|
|
self.isSoundCheckStart = YES;
|
|
self.isSoundCheckStart = YES;
|
|
|
|
+ self.isDelayCheckStart = NO;
|
|
[self startRecordService];
|
|
[self startRecordService];
|
|
}
|
|
}
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"endSoundCheck"]) {
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"endSoundCheck"]) {
|
|
@@ -450,19 +583,13 @@
|
|
NSMutableDictionary *sendParm = [NSMutableDictionary dictionaryWithDictionary:parm];
|
|
NSMutableDictionary *sendParm = [NSMutableDictionary dictionaryWithDictionary:parm];
|
|
NSMutableDictionary *contentParm = [NSMutableDictionary dictionaryWithDictionary:[sendParm ks_dictionaryValueForKey:@"content"]];
|
|
NSMutableDictionary *contentParm = [NSMutableDictionary dictionaryWithDictionary:[sendParm ks_dictionaryValueForKey:@"content"]];
|
|
if (self.videoRecordManager) {
|
|
if (self.videoRecordManager) {
|
|
|
|
+
|
|
MJWeakSelf;
|
|
MJWeakSelf;
|
|
- [self.videoRecordManager uploadRecordVideoSuccess:^(NSString * _Nonnull videoUrl) {
|
|
|
|
- [contentParm setValue:@"success" forKey:@"type"];
|
|
|
|
- [contentParm setValue:videoUrl forKey:@"filePath"];
|
|
|
|
- [contentParm setValue:@"上传成功" forKey:@"message"];
|
|
|
|
- [sendParm setValue:contentParm forKey:@"content"];
|
|
|
|
-
|
|
|
|
- [weakSelf postMessage:sendParm];
|
|
|
|
- } failure:^(NSString * _Nonnull desc) {
|
|
|
|
- [contentParm setValue:@"error" forKey:@"type"];
|
|
|
|
- [contentParm setValue:desc forKey:@"message"];
|
|
|
|
- [sendParm setValue:contentParm forKey:@"content"];
|
|
|
|
- [weakSelf postMessage:sendParm];
|
|
|
|
|
|
+ [self.videoRecordManager saveVideoCallback:^(BOOL isSuccess, NSString * _Nullable message) {
|
|
|
|
+ if (isSuccess) {
|
|
|
|
+ [LOADING_MANAGER MBShowAUTOHidingInWindow:@"已保存到相册"];
|
|
|
|
+ [weakSelf uploadVideoWithParm:contentParm sendParm:sendParm];
|
|
|
|
+ }
|
|
}];
|
|
}];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -470,15 +597,15 @@
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudDetail"]) { // 初始化方法
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudDetail"]) { // 初始化方法
|
|
/**
|
|
/**
|
|
api: 'cloudDetail',
|
|
api: 'cloudDetail',
|
|
- content: {
|
|
|
|
- midi: '',
|
|
|
|
- denominator: 4,
|
|
|
|
- numerator: 4,
|
|
|
|
- // xml整体原始速度
|
|
|
|
- originalSpeed: 90,
|
|
|
|
- // 间隔(ms)
|
|
|
|
- interval: 50
|
|
|
|
- }
|
|
|
|
|
|
+ content: {
|
|
|
|
+ midi: '',
|
|
|
|
+ denominator: 4,
|
|
|
|
+ numerator: 4,
|
|
|
|
+ // xml整体原始速度
|
|
|
|
+ originalSpeed: 90,
|
|
|
|
+ // 间隔(ms)
|
|
|
|
+ interval: 50
|
|
|
|
+ }
|
|
*/
|
|
*/
|
|
|
|
|
|
[self configAudioSession];
|
|
[self configAudioSession];
|
|
@@ -510,16 +637,16 @@
|
|
|
|
|
|
}];
|
|
}];
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudGetMediaStatus"]) { // 获取播放状态
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudGetMediaStatus"]) { // 获取播放状态
|
|
- /**
|
|
|
|
- api: 'cloudGetMediaStatus',
|
|
|
|
|
|
+ /**
|
|
|
|
+ api: 'cloudGetMediaStatus',
|
|
content: {
|
|
content: {
|
|
- status: 'init' | 'play' | 'suspend'
|
|
|
|
|
|
+ status: 'init' | 'play' | 'suspend'
|
|
}
|
|
}
|
|
- */
|
|
|
|
|
|
+ */
|
|
NSString *engineStatus = @"init";
|
|
NSString *engineStatus = @"init";
|
|
if (self.initEngineSuccess) {
|
|
if (self.initEngineSuccess) {
|
|
if (self.isPlaying) {
|
|
if (self.isPlaying) {
|
|
@@ -539,18 +666,18 @@
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudPlay"]) { // 播放
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudPlay"]) { // 播放
|
|
/**
|
|
/**
|
|
api: 'cloudPlay',
|
|
api: 'cloudPlay',
|
|
- content: {
|
|
|
|
- // 当前曲目id
|
|
|
|
- songID: 0,
|
|
|
|
- // xml整体原始速度
|
|
|
|
- originalSpeed: 90,
|
|
|
|
- // 当前选择速度
|
|
|
|
- speed: 90,
|
|
|
|
- // 开始时间(ms)
|
|
|
|
- startTime: 0
|
|
|
|
- // 播放频率
|
|
|
|
- hertz:440
|
|
|
|
- }
|
|
|
|
|
|
+ content: {
|
|
|
|
+ // 当前曲目id
|
|
|
|
+ songID: 0,
|
|
|
|
+ // xml整体原始速度
|
|
|
|
+ originalSpeed: 90,
|
|
|
|
+ // 当前选择速度
|
|
|
|
+ speed: 90,
|
|
|
|
+ // 开始时间(ms)
|
|
|
|
+ startTime: 0
|
|
|
|
+ // 播放频率
|
|
|
|
+ hertz:440
|
|
|
|
+ }
|
|
*/
|
|
*/
|
|
NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
self.currentSongId = [content ks_stringValueForKey:@"songID"];
|
|
self.currentSongId = [content ks_stringValueForKey:@"songID"];
|
|
@@ -571,26 +698,26 @@
|
|
[self postMessage:parm];
|
|
[self postMessage:parm];
|
|
}
|
|
}
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudSuspend"]) { // 暂停
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudSuspend"]) { // 暂停
|
|
- /**
|
|
|
|
- api: 'cloudSuspend',
|
|
|
|
- content: {
|
|
|
|
- // 当前曲目id
|
|
|
|
- songID: 0,
|
|
|
|
- }
|
|
|
|
- */
|
|
|
|
- [self stopPlayAction];
|
|
|
|
- [self postMessage:parm];
|
|
|
|
-
|
|
|
|
|
|
+ /**
|
|
|
|
+ api: 'cloudSuspend',
|
|
|
|
+ content: {
|
|
|
|
+ // 当前曲目id
|
|
|
|
+ songID: 0,
|
|
|
|
+ }
|
|
|
|
+ */
|
|
|
|
+ [self stopPlayAction];
|
|
|
|
+ [self postMessage:parm];
|
|
|
|
+
|
|
}
|
|
}
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudSetCurrentTime"]) { // // 跳转指定位置
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudSetCurrentTime"]) { // // 跳转指定位置
|
|
/**
|
|
/**
|
|
api: 'cloudSetCurrentTime',
|
|
api: 'cloudSetCurrentTime',
|
|
- content: {
|
|
|
|
- // 当前曲目id
|
|
|
|
- songID: 0,
|
|
|
|
- // 指定位置时间(ms)
|
|
|
|
- currentTime: 0
|
|
|
|
- }
|
|
|
|
|
|
+ content: {
|
|
|
|
+ // 当前曲目id
|
|
|
|
+ songID: 0,
|
|
|
|
+ // 指定位置时间(ms)
|
|
|
|
+ currentTime: 0
|
|
|
|
+ }
|
|
*/
|
|
*/
|
|
NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
Float64 currentTime = [content ks_doubleValueForKey:@"currentTime"];
|
|
Float64 currentTime = [content ks_doubleValueForKey:@"currentTime"];
|
|
@@ -602,14 +729,14 @@
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudChangeSpeed"]) { // 调速 范围(45-270整数)
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudChangeSpeed"]) { // 调速 范围(45-270整数)
|
|
/**
|
|
/**
|
|
api: 'cloudChangeSpeed',
|
|
api: 'cloudChangeSpeed',
|
|
- content: {
|
|
|
|
- // 当前曲目id
|
|
|
|
- songID: 0,
|
|
|
|
- // 调整速度
|
|
|
|
- speed: 90
|
|
|
|
- // xml整体原始速度
|
|
|
|
- originalSpeed: 90,
|
|
|
|
- }
|
|
|
|
|
|
+ content: {
|
|
|
|
+ // 当前曲目id
|
|
|
|
+ songID: 0,
|
|
|
|
+ // 调整速度
|
|
|
|
+ speed: 90
|
|
|
|
+ // xml整体原始速度
|
|
|
|
+ originalSpeed: 90,
|
|
|
|
+ }
|
|
*/
|
|
*/
|
|
NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
float speed = [content ks_floatValueForKey:@"speed"];
|
|
float speed = [content ks_floatValueForKey:@"speed"];
|
|
@@ -624,14 +751,14 @@
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudVolume"]) {
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudVolume"]) {
|
|
/**
|
|
/**
|
|
api: 'cloudVolume',
|
|
api: 'cloudVolume',
|
|
- content: {
|
|
|
|
- parts: [
|
|
|
|
- {
|
|
|
|
- name: '',
|
|
|
|
- volume: 90,//0-100
|
|
|
|
- }
|
|
|
|
- ]
|
|
|
|
- }
|
|
|
|
|
|
+ content: {
|
|
|
|
+ parts: [
|
|
|
|
+ {
|
|
|
|
+ name: '',
|
|
|
|
+ volume: 90,//0-100
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
|
|
+ }
|
|
*/
|
|
*/
|
|
NSLog(@"-cloudVolume -----%@",parm);
|
|
NSLog(@"-cloudVolume -----%@",parm);
|
|
NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
@@ -647,15 +774,15 @@
|
|
[self.playerEngine getAllTrackVolume];
|
|
[self.playerEngine getAllTrackVolume];
|
|
}
|
|
}
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudMetronome"]) { // 节拍器播放
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudMetronome"]) { // 节拍器播放
|
|
- self.metronomeParm = [NSMutableDictionary dictionaryWithDictionary:parm];
|
|
|
|
- NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
|
|
- NSInteger repeatCount = [content ks_integerValueForKey:@"repeat"];
|
|
|
|
- NSInteger denominator = [content ks_integerValueForKey:@"denominator"];
|
|
|
|
- NSInteger numerator = [content ks_integerValueForKey:@"numerator"];
|
|
|
|
- NSInteger supplement = [content ks_integerValueForKey:@"supplement"];
|
|
|
|
- NSString *beatString = [NSString stringWithFormat:@"%zd/%zd", numerator,denominator];
|
|
|
|
- self.beatType = [self getBeatTypeFromString:beatString];
|
|
|
|
- [self showBeatViewRepeatCount:repeatCount supplement:supplement];
|
|
|
|
|
|
+ self.metronomeParm = [NSMutableDictionary dictionaryWithDictionary:parm];
|
|
|
|
+ NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
|
|
+ NSInteger repeatCount = [content ks_integerValueForKey:@"repeat"];
|
|
|
|
+ NSInteger denominator = [content ks_integerValueForKey:@"denominator"];
|
|
|
|
+ NSInteger numerator = [content ks_integerValueForKey:@"numerator"];
|
|
|
|
+ NSInteger supplement = [content ks_integerValueForKey:@"supplement"];
|
|
|
|
+ NSString *beatString = [NSString stringWithFormat:@"%zd/%zd", numerator,denominator];
|
|
|
|
+ self.beatType = [self getBeatTypeFromString:beatString];
|
|
|
|
+ [self showBeatViewRepeatCount:repeatCount supplement:supplement];
|
|
}
|
|
}
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudDestroy"]) { // 销毁播放器
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudDestroy"]) { // 销毁播放器
|
|
self.initEngineSuccess = NO;
|
|
self.initEngineSuccess = NO;
|
|
@@ -676,16 +803,6 @@
|
|
[self removeCustomLoadingView];
|
|
[self removeCustomLoadingView];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudToggleFollow"]) { // 跟音
|
|
|
|
- NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
|
|
- NSString *status = [content ks_stringValueForKey:@"state"];
|
|
|
|
- if ([status isEqualToString:@"start"]) { // 开始
|
|
|
|
- [self startTuner];
|
|
|
|
- }
|
|
|
|
- else if ([status isEqualToString:@"end"]) { // 结束
|
|
|
|
- [self stopTuner];
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudAccompanyMessage"]) { // 获取伴奏
|
|
else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudAccompanyMessage"]) { // 获取伴奏
|
|
NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
NSString *accompanyUrl = [content ks_stringValueForKey:@"accompanyUrl"];
|
|
NSString *accompanyUrl = [content ks_stringValueForKey:@"accompanyUrl"];
|
|
@@ -701,7 +818,7 @@
|
|
[self downloadUrl:accompanyUrl success:^{
|
|
[self downloadUrl:accompanyUrl success:^{
|
|
[weakSelf configVideoRecord:fileUrl];
|
|
[weakSelf configVideoRecord:fileUrl];
|
|
} faliure:nil];
|
|
} faliure:nil];
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
@@ -709,6 +826,100 @@
|
|
[self configVideoRecord:nil];
|
|
[self configVideoRecord:nil];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // 跟音
|
|
|
|
+ else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudToggleFollow"]) {
|
|
|
|
+ NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
|
|
+ NSString *status = [content ks_stringValueForKey:@"state"];
|
|
|
|
+ if ([status isEqualToString:@"start"]) { // 开始
|
|
|
|
+ [self startTuner];
|
|
|
|
+ }
|
|
|
|
+ else if ([status isEqualToString:@"end"]) { // 结束
|
|
|
|
+ [self stopTuner];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // 延迟检测
|
|
|
|
+ else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"startTune"]) { // 延迟测试开始
|
|
|
|
+ NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
|
|
+ NSInteger count = [content ks_integerValueForKey:@"count"];
|
|
|
|
+ if (count == 0) {
|
|
|
|
+ [self.delayArray removeAllObjects];
|
|
|
|
+ self.checkIndex = 0;
|
|
|
|
+ }
|
|
|
|
+ self.checkIndex += 1;
|
|
|
|
+ [self configRecordManager];
|
|
|
|
+ [self postMessage:parm];
|
|
|
|
+ self.isCompareStart = NO;
|
|
|
|
+ self.isSoundCheckStart = NO;
|
|
|
|
+ self.isDelayCheckStart = YES;
|
|
|
|
+ [self startRecordService];
|
|
|
|
+ }
|
|
|
|
+ else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"endTune"]) { // 延迟测试结束
|
|
|
|
+
|
|
|
|
+ self.isDelayCheckStart = NO;
|
|
|
|
+ [self stopRecordService];
|
|
|
|
+ [self postMessage:parm];
|
|
|
|
+ [self stopMp3Player];
|
|
|
|
+ [self sendAdjustEndMessage]; // 发送结束消息
|
|
|
|
+ }
|
|
|
|
+ else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"finishTune"]) { // 延迟测试结束
|
|
|
|
+ NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
|
|
+
|
|
|
|
+ NSInteger errorCount = 0;
|
|
|
|
+ NSInteger totalDelay = 0;
|
|
|
|
+ for (NSInteger index = 0 ; index < self.delayArray.count; index++) {
|
|
|
|
+ NSInteger micDelay = [self.delayArray[index] integerValue];
|
|
|
|
+ if (micDelay > 10 && micDelay < 100) {
|
|
|
|
+ totalDelay += micDelay;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ errorCount++;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ NSMutableDictionary *contentParm = [NSMutableDictionary dictionaryWithDictionary:content];
|
|
|
|
+ if (errorCount > 1) { // 错误次数过多
|
|
|
|
+ [contentParm setValue:@(NO) forKey:@"result"];
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ [contentParm setValue:@(YES) forKey:@"result"];
|
|
|
|
+ NSInteger averageDelay = totalDelay / (self.delayArray.count - errorCount);
|
|
|
|
+ UserDefaultSet([NSNumber numberWithDouble:averageDelay], @"micDelay");
|
|
|
|
+ }
|
|
|
|
+ NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
|
|
|
|
+ [sendParm setValue:@"finishTune" forKey:@"api"];
|
|
|
|
+ [sendParm setValue:contentParm forKey:@"content"];
|
|
|
|
+ [self postMessage:sendParm];
|
|
|
|
+ [self.delayArray removeAllObjects];
|
|
|
|
+ self.checkIndex = 0;
|
|
|
|
+ }
|
|
|
|
+ else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"getDeviceDelay"]) {
|
|
|
|
+ NSInteger micDelay = [UserDefaultObjectForKey(@"micDelay") integerValue];
|
|
|
|
+ NSMutableDictionary *content = [NSMutableDictionary dictionaryWithDictionary:[parm ks_dictionaryValueForKey:@"content"]];
|
|
|
|
+ [content setValue:[NSNumber numberWithInteger:micDelay] forKey:@"value"];
|
|
|
|
+ NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
|
|
|
|
+ [sendParm setValue:@"getDeviceDelay" forKey:@"api"];
|
|
|
|
+ [sendParm setValue:content forKey:@"content"];
|
|
|
|
+ [self postMessage:sendParm];
|
|
|
|
+ }
|
|
|
|
+ // 音视频合成
|
|
|
|
+ else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"openAdjustRecording"]) {
|
|
|
|
+ KSMediaMergeView *mergeView = [[KSMediaMergeView alloc] init];
|
|
|
|
+ [self.view addSubview:mergeView];
|
|
|
|
+ [mergeView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
|
|
+ make.left.right.top.bottom.mas_equalTo(self.view);
|
|
|
|
+ }];
|
|
|
|
+ NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
|
|
|
|
+ mergeView.recordId = [content ks_stringValueForKey:@"recordId"];
|
|
|
|
+ mergeView.songName = [content ks_stringValueForKey:@"title"];
|
|
|
|
+ mergeView.coverImage = [content ks_stringValueForKey:@"coverImg"];
|
|
|
|
+ if (self.AQManager) {
|
|
|
|
+ self.recordUrl = self.AQManager.audioUrl;
|
|
|
|
+ }
|
|
|
|
+ MJWeakSelf;
|
|
|
|
+ [mergeView configWithVideoUrl:self.videoRecordManager.videoFileURL bgAudioUrl:self.bgAudioUrl remoteBgUrl:self.accompanyUrl recordUrl:self.recordUrl offsetTime:self.offsetTime mergeCallback:^{
|
|
|
|
+ [weakSelf musicPublishCallBack:content];
|
|
|
|
+ }];
|
|
|
|
+ }
|
|
else {
|
|
else {
|
|
[super handleScriptMessageSource:parm];
|
|
[super handleScriptMessageSource:parm];
|
|
}
|
|
}
|
|
@@ -716,7 +927,29 @@
|
|
});
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+- (void)musicPublishCallBack:(NSDictionary *)content {
|
|
|
|
+ NSMutableDictionary *parm = [NSMutableDictionary dictionary];
|
|
|
|
+ [parm setValue:@"hideComplexButton" forKey:@"api"];
|
|
|
|
+ [parm setValue:@{} forKey:@"content"];
|
|
|
|
+ [self postMessage:parm];
|
|
|
|
+}
|
|
|
|
+- (void)uploadVideoWithParm:(NSMutableDictionary *)contentParm sendParm:(NSMutableDictionary *)sendParm {
|
|
|
|
+ MJWeakSelf;
|
|
|
|
+ [self.videoRecordManager uploadRecordVideoSuccess:^(NSString * _Nonnull videoUrl) {
|
|
|
|
+ [contentParm setValue:@"success" forKey:@"type"];
|
|
|
|
+ [contentParm setValue:videoUrl forKey:@"filePath"];
|
|
|
|
+ [contentParm setValue:@"上传成功" forKey:@"message"];
|
|
|
|
+ [sendParm setValue:contentParm forKey:@"content"];
|
|
|
|
+
|
|
|
|
+ [weakSelf postMessage:sendParm];
|
|
|
|
+ } failure:^(NSString * _Nonnull desc) {
|
|
|
|
+ [contentParm setValue:@"error" forKey:@"type"];
|
|
|
|
+ [contentParm setValue:desc forKey:@"message"];
|
|
|
|
+ [sendParm setValue:contentParm forKey:@"content"];
|
|
|
|
+ [weakSelf postMessage:sendParm];
|
|
|
|
+ }];
|
|
|
|
+}
|
|
- (void)showAlertWithMessage:(NSString *)message type:(CHECKDEVICETYPE)deviceType {
|
|
- (void)showAlertWithMessage:(NSString *)message type:(CHECKDEVICETYPE)deviceType {
|
|
[KSPremissionAlert shareInstanceDisplayImage:deviceType message:message showInView:self.view cancel:^{
|
|
[KSPremissionAlert shareInstanceDisplayImage:deviceType message:message showInView:self.view cancel:^{
|
|
|
|
|
|
@@ -728,15 +961,15 @@
|
|
|
|
|
|
- (void)openSettingView {
|
|
- (void)openSettingView {
|
|
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
|
|
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
- (void)downloadUrl:(NSString *)url success:(void(^)(void))success faliure:(void(^)(void))faliure {
|
|
- (void)downloadUrl:(NSString *)url success:(void(^)(void))success faliure:(void(^)(void))faliure {
|
|
-// [LOADING_MANAGER showHUD];
|
|
|
|
|
|
+
|
|
[KSNetworkingManager downloadFileRequestWithFileUrl:url progress:^(int64_t bytesRead, int64_t totalBytes) {
|
|
[KSNetworkingManager downloadFileRequestWithFileUrl:url progress:^(int64_t bytesRead, int64_t totalBytes) {
|
|
|
|
|
|
} success:^(NSURL * _Nonnull fileUrl) {
|
|
} success:^(NSURL * _Nonnull fileUrl) {
|
|
-// [LOADING_MANAGER removeHUD];
|
|
|
|
|
|
+
|
|
if ([self saveAccompanyFileWithUrl:fileUrl accompanyUrl:url]) {
|
|
if ([self saveAccompanyFileWithUrl:fileUrl accompanyUrl:url]) {
|
|
success();
|
|
success();
|
|
}
|
|
}
|
|
@@ -774,11 +1007,11 @@
|
|
}
|
|
}
|
|
|
|
|
|
- (void)downloadMidiFile:(NSString *)midiUrl success:(void(^)(void))success faliure:(void(^)(void))faliure {
|
|
- (void)downloadMidiFile:(NSString *)midiUrl success:(void(^)(void))success faliure:(void(^)(void))faliure {
|
|
-// [LOADING_MANAGER showHUD];
|
|
|
|
|
|
+
|
|
[KSNetworkingManager downloadFileRequestWithFileUrl:midiUrl progress:^(int64_t bytesRead, int64_t totalBytes) {
|
|
[KSNetworkingManager downloadFileRequestWithFileUrl:midiUrl progress:^(int64_t bytesRead, int64_t totalBytes) {
|
|
|
|
|
|
} success:^(NSURL * _Nonnull fileUrl) {
|
|
} success:^(NSURL * _Nonnull fileUrl) {
|
|
-// [LOADING_MANAGER removeHUD];
|
|
|
|
|
|
+
|
|
if ([self saveMidiFileWithUrl:fileUrl midiUrl:midiUrl]) {
|
|
if ([self saveMidiFileWithUrl:fileUrl midiUrl:midiUrl]) {
|
|
success();
|
|
success();
|
|
}
|
|
}
|
|
@@ -898,6 +1131,28 @@
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+- (void)sendAdjustEndMessage {
|
|
|
|
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
|
|
+ // 上传停止的信息 发送给服务端
|
|
|
|
+ NSString *endMessage = @"recordEnd";
|
|
|
|
+ NSString *endData = [self configDataCommond:endMessage body:nil type:@"DELAY_CHECK"];
|
|
|
|
+ [self sendDataToSocketService:endData];
|
|
|
|
+ self.isDelayCheckStart = NO;
|
|
|
|
+ NSLog(@"---- send adjust end message");
|
|
|
|
+ });
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (void)sendOffsetTimeToService {
|
|
|
|
+ // 上传停止的信息 发送给服务端
|
|
|
|
+ NSString *offsetMessage = @"audioPlayStart";
|
|
|
|
+ NSTimeInterval micDelay = [UserDefault(@"micDelay") doubleValue];
|
|
|
|
+ NSDictionary *dic = @{@"offsetTime" : [NSNumber numberWithInteger:self.offsetTime], @"micDelay": [NSNumber numberWithInteger:micDelay]};
|
|
|
|
+ NSString *endData = [self configDataCommond:offsetMessage body:dic type:@"SOUND_COMPARE"];
|
|
|
|
+ NSLog(@"------ %@", endData);
|
|
|
|
+ [self sendDataToSocketService:endData];
|
|
|
|
+ self.isCompareStart = NO;
|
|
|
|
+}
|
|
|
|
+
|
|
#pragma mark-------- KSAQRecordManagerDelegate
|
|
#pragma mark-------- KSAQRecordManagerDelegate
|
|
- (void)recordInterruption {
|
|
- (void)recordInterruption {
|
|
NSDictionary *postParm = @{@"api" : @"cancelEvaluating",
|
|
NSDictionary *postParm = @{@"api" : @"cancelEvaluating",
|
|
@@ -969,11 +1224,6 @@
|
|
NSString *startMessage = @"recordStart";
|
|
NSString *startMessage = @"recordStart";
|
|
NSString *startString = [self configDataCommond:startMessage body:nil type:@"SOUND_COMPARE"];
|
|
NSString *startString = [self configDataCommond:startMessage body:nil type:@"SOUND_COMPARE"];
|
|
[self sendDataToSocketService:startString];
|
|
[self sendDataToSocketService:startString];
|
|
-
|
|
|
|
-// // 发送开始录制的消息给H5
|
|
|
|
-// if (self.recordParm) {
|
|
|
|
-// [self postMessage:self.recordParm];
|
|
|
|
-// }
|
|
|
|
}
|
|
}
|
|
else if (self.isSoundCheckStart) { // 校音开始
|
|
else if (self.isSoundCheckStart) { // 校音开始
|
|
|
|
|
|
@@ -983,7 +1233,22 @@
|
|
NSString *startString = [self configDataCommond:checkStartMessage body:nil type:@"PITCH_DETECTION"];
|
|
NSString *startString = [self configDataCommond:checkStartMessage body:nil type:@"PITCH_DETECTION"];
|
|
[self sendDataToSocketService:startString];
|
|
[self sendDataToSocketService:startString];
|
|
}
|
|
}
|
|
-// NSLog(@"--------- send audio data length %d", length);
|
|
|
|
|
|
+ else if (self.isDelayCheckStart) {
|
|
|
|
+ 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;
|
|
|
|
+ }
|
|
|
|
+ NSDictionary *parm = @{@"HZ" : @(frequence)};
|
|
|
|
+ NSString *startString = [self configDataCommond:checkStartMessage body:parm type:@"DELAY_CHECK"];
|
|
|
|
+ [self sendDataToSocketService:startString];
|
|
|
|
+ }
|
|
|
|
+ // NSLog(@"--------- send audio data length %d", length);
|
|
[self sendDataToSocketService:pushData];
|
|
[self sendDataToSocketService:pushData];
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1137,7 +1402,6 @@
|
|
[content setValue:@(currentTime*1000) forKey:@"currentTime"];
|
|
[content setValue:@(currentTime*1000) forKey:@"currentTime"];
|
|
[sendParm setValue:content forKey:@"content"];
|
|
[sendParm setValue:content forKey:@"content"];
|
|
[self postMessage:sendParm];
|
|
[self postMessage:sendParm];
|
|
-// NSLog(@"------time source %@", content);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- (void)playEnd {
|
|
- (void)playEnd {
|
|
@@ -1285,14 +1549,110 @@
|
|
return hasSaveFile;
|
|
return hasSaveFile;
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
-#pragma mark - Navigation
|
|
|
|
|
|
+#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];
|
|
|
|
+ }
|
|
|
|
+ return _dingPlayer;
|
|
|
|
+}
|
|
|
|
|
|
-// In a storyboard-based application, you will often want to do a little preparation before navigation
|
|
|
|
-- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
|
|
|
|
- // Get the new view controller using [segue destinationViewController].
|
|
|
|
- // Pass the selected object to the new view controller.
|
|
|
|
|
|
+- (kSNewPlayer *)dongPlayer {
|
|
|
|
+ if (!_dongPlayer) {
|
|
|
|
+ _dongPlayer = [[kSNewPlayer alloc] init];
|
|
|
|
+ }
|
|
|
|
+ return _dongPlayer;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (kSNewPlayer *)musicPlayer {
|
|
|
|
+ if (!_musicPlayer) {
|
|
|
|
+ _musicPlayer = [[kSNewPlayer alloc] init];
|
|
|
|
+ }
|
|
|
|
+ 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;
|
|
|
|
+ self.offsetTime = self.playerStartTime - self.recordStartTime;
|
|
|
|
+ NSLog(@"--------- check player offset time -- %zd", self.offsetTime);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (playTime >= 300 && playTime < 310 && player == self.musicPlayer) {
|
|
|
|
+ if (self.recordStartTime > 0) {
|
|
|
|
+ NSLog(@" --- music player start play time %f", currentInterval*1000 - playTime);
|
|
|
|
+ self.playerStartTime = currentInterval*1000 - playTime;
|
|
|
|
+ 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)preparePlay:(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];
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+- (NSMutableArray *)delayArray {
|
|
|
|
+ if (!_delayArray) {
|
|
|
|
+ _delayArray = [NSMutableArray array];
|
|
|
|
+ }
|
|
|
|
+ return _delayArray;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ #pragma mark - Navigation
|
|
|
|
+
|
|
|
|
+ // In a storyboard-based application, you will often want to do a little preparation before navigation
|
|
|
|
+ - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
|
|
|
|
+ // Get the new view controller using [segue destinationViewController].
|
|
|
|
+ // Pass the selected object to the new view controller.
|
|
|
|
+ }
|
|
|
|
+ */
|
|
|
|
|
|
@end
|
|
@end
|