RQMusicManager.m 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. //
  2. // RQMusicManager.m
  3. // JSJP
  4. //
  5. // Created by 张嵘 on 2021/8/17.
  6. //
  7. #import "RQMusicManager.h"
  8. static void *kStatusKVOKey = &kStatusKVOKey;
  9. static void *kDurationKVOKey = &kDurationKVOKey;
  10. static void *kBufferingRatioKVOKey = &kBufferingRatioKVOKey;
  11. @interface RQMusicManager ()
  12. @property (nonatomic, readwrite, strong) DOUAudioStreamer *streamer;
  13. @property (nonatomic, readwrite, copy) DOUAudioStreamerStatusBlock audioStreamerStatusBlock;
  14. @property (nonatomic, readwrite, copy) NSString *urlString;
  15. @end
  16. @implementation RQMusicManager
  17. @def_singleton(RQMusicManager);
  18. - (void)rq_cancelStreamer {
  19. if (_streamer != nil) {
  20. [_streamer pause];
  21. if (self.audioStreamerStatusBlock) {
  22. self.audioStreamerStatusBlock(DOUAudioStreamerPaused);
  23. }
  24. [_streamer removeObserver:self forKeyPath:@"status"];
  25. [_streamer removeObserver:self forKeyPath:@"duration"];
  26. [_streamer removeObserver:self forKeyPath:@"bufferingRatio"];
  27. _streamer = nil;
  28. _urlString = nil;
  29. }
  30. }
  31. - (void)rq_resetStreamer {
  32. [self rq_cancelStreamer];
  33. RQTrack *track = [[RQTrack alloc] init];
  34. self.urlString = track.audioFileURL.path;
  35. _streamer = [DOUAudioStreamer streamerWithAudioFile:track];
  36. [_streamer addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:kStatusKVOKey];
  37. [_streamer addObserver:self forKeyPath:@"duration" options:NSKeyValueObservingOptionNew context:kDurationKVOKey];
  38. [_streamer addObserver:self forKeyPath:@"bufferingRatio" options:NSKeyValueObservingOptionNew context:kBufferingRatioKVOKey];
  39. [_streamer play];
  40. [self rq_setupHintForStreamer];
  41. }
  42. - (void)rq_resetStreamerWithURLString:(NSString *)urlString {
  43. [self rq_cancelStreamer];
  44. RQTrack *track = [[RQTrack alloc] init];
  45. track.audioFileURL = [NSURL URLWithString:urlString];
  46. self.urlString = urlString;
  47. _streamer = [DOUAudioStreamer streamerWithAudioFile:track];
  48. [_streamer addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:kStatusKVOKey];
  49. [_streamer addObserver:self forKeyPath:@"duration" options:NSKeyValueObservingOptionNew context:kDurationKVOKey];
  50. [_streamer addObserver:self forKeyPath:@"bufferingRatio" options:NSKeyValueObservingOptionNew context:kBufferingRatioKVOKey];
  51. [_streamer play];
  52. [self rq_setupHintForStreamer];
  53. }
  54. - (void)rq_resetStreamerWithURLString:(NSString *)urlString DOUAudioStreamerStatusBlock:(DOUAudioStreamerStatusBlock)audioStreamerStatusBlock {
  55. dispatch_async_on_main_queue(^{
  56. _audioStreamerStatusBlock = nil;
  57. _audioStreamerStatusBlock = audioStreamerStatusBlock;
  58. [self rq_cancelStreamer];
  59. RQTrack *track = [[RQTrack alloc] init];
  60. track.audioFileURL = [NSURL URLWithString:urlString];
  61. self.urlString = urlString;
  62. _streamer = [DOUAudioStreamer streamerWithAudioFile:track];
  63. [_streamer addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:kStatusKVOKey];
  64. [_streamer addObserver:self forKeyPath:@"duration" options:NSKeyValueObservingOptionNew context:kDurationKVOKey];
  65. [_streamer addObserver:self forKeyPath:@"bufferingRatio" options:NSKeyValueObservingOptionNew context:kBufferingRatioKVOKey];
  66. [_streamer play];
  67. [self rq_setupHintForStreamer];
  68. });
  69. }
  70. - (void)rq_resetStreamerWithDOUAudioStreamerStatusBlock:(DOUAudioStreamerStatusBlock)audioStreamerStatusBlock {
  71. _audioStreamerStatusBlock = nil;
  72. _audioStreamerStatusBlock = audioStreamerStatusBlock;
  73. [self rq_resetStreamer];
  74. }
  75. - (void)rq_setupHintForStreamer {
  76. [DOUAudioStreamer setHintWithAudioFile:self.audioTrack];
  77. }
  78. - (void)_updateStatus {
  79. if (self.audioStreamerStatusBlock) {
  80. self.audioStreamerStatusBlock([_streamer status]);
  81. }
  82. switch ([_streamer status]) {
  83. case DOUAudioStreamerPlaying:
  84. break;
  85. case DOUAudioStreamerPaused:
  86. break;
  87. case DOUAudioStreamerIdle:
  88. break;
  89. case DOUAudioStreamerFinished:
  90. break;
  91. case DOUAudioStreamerBuffering:
  92. break;
  93. case DOUAudioStreamerError:
  94. NSLog(@"%@",@"DOUAudioStreamerError");
  95. break;
  96. }
  97. }
  98. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
  99. if (context == kStatusKVOKey) {
  100. [self performSelector:@selector(_updateStatus)
  101. onThread:[NSThread mainThread]
  102. withObject:nil
  103. waitUntilDone:NO];
  104. } else if (context == kDurationKVOKey) {
  105. } else if (context == kBufferingRatioKVOKey) {
  106. } else {
  107. [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  108. }
  109. }
  110. - (RQTrack *)audioTrack {
  111. if (!_audioTrack) {
  112. _audioTrack = [[RQTrack alloc] init];
  113. }
  114. return _audioTrack;
  115. }
  116. @end