75 lines
1.8 KiB
Objective-C
75 lines
1.8 KiB
Objective-C
//
|
|
// MessageAudioCenter.m
|
|
// YUMI
|
|
//
|
|
// Created by YUMI on 2022/4/22.
|
|
//
|
|
|
|
#import "MessageAudioCenter.h"
|
|
#import <NIMSDK/NIMSDK.h>
|
|
|
|
@interface MessageAudioCenter ()<NIMMediaManagerDelegate>
|
|
@property (nonatomic,assign) NSInteger retryCount;
|
|
@property (nonatomic,strong,nullable) NIMMessage *currentPlayingMessage;
|
|
@end
|
|
|
|
@implementation MessageAudioCenter
|
|
|
|
+ (instancetype)shareInstance {
|
|
static MessageAudioCenter *instance;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^{
|
|
instance = [[MessageAudioCenter alloc] init];
|
|
});
|
|
return instance;
|
|
}
|
|
|
|
- (instancetype)init {
|
|
self = [super init];
|
|
if (self) {
|
|
[[NIMSDK sharedSDK].mediaManager addDelegate:self];
|
|
[self resetRetryCount];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)resetRetryCount {
|
|
_retryCount = 3;
|
|
}
|
|
|
|
- (void)play:(NIMMessage *)message {
|
|
NIMAudioObject *audioObject = (NIMAudioObject *)message.messageObject;
|
|
if ([audioObject isKindOfClass:[NIMAudioObject class]]) {
|
|
self.currentPlayingMessage = message;
|
|
message.isPlayed = YES;
|
|
[[NIMSDK sharedSDK].mediaManager play:audioObject.path];
|
|
}
|
|
}
|
|
|
|
|
|
#pragma mark - NIMMediaManagerDelegate
|
|
|
|
- (void)playAudio:(NSString *)filePath didBeganWithError:(NSError *)error
|
|
{
|
|
if (error) {
|
|
if (_retryCount > 0){
|
|
// iPhone4 和 iPhone 4S 上连播会由于设备释放过慢导致 AudioQueue 启动不了的问题,这里做个延迟重试,最多重试 3 次 ( code -66681 )
|
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
[[NIMSDK sharedSDK].mediaManager play:filePath];
|
|
});
|
|
}else{
|
|
self.currentPlayingMessage = nil;
|
|
[self resetRetryCount];
|
|
}
|
|
} else {
|
|
[self resetRetryCount];
|
|
}
|
|
}
|
|
|
|
- (void)playAudio:(NSString *)filePath didCompletedWithError:(nullable NSError *)error {
|
|
self.currentPlayingMessage = nil;
|
|
}
|
|
|
|
|
|
@end
|