Commit f283b9c3 cgx

优化播放逻辑,完成上一首/下一首功能

1 个父辈 f02ca2ec
......@@ -38,4 +38,6 @@
#import "LoginUtils.h"
#import "TimerProxy.h"
#endif /* PrefixHeader_pch */
......@@ -8,7 +8,6 @@
#import "MusicPlayerController.h"
#import "MusicPlayerView.h"
#import <FSAudioController.h>
#import "TimerProxy.h"
#import "SubAudioModel.h"
@interface MusicPlayerController () <MusicPlayerViewDelegate>
......@@ -19,6 +18,8 @@
@property (nonatomic, strong) CADisplayLink *progressTimer;
/// 是否正在拖动滑块
@property (nonatomic, assign) BOOL isDraging;
/// streamState
@property (nonatomic, assign) FSAudioStreamState streamState;
@end
@implementation MusicPlayerController
......@@ -31,14 +32,13 @@
[super viewDidLoad];
if (self.currentIndex >= self.playAudios.count) { return; }
SubAudioModel *currentAudioModel = self.playAudios[self.currentIndex];
[self.playerView updatePlayerView:currentAudioModel];
[self launchPlayer];
WS(weakSelf);
[self.audioStream playFromURL:[NSURL URLWithString:currentAudioModel.audio_url]];
[self.audioStream setOnStateChange:^(FSAudioStreamState state) {
weakSelf.streamState = state;
weakSelf.playerView.isPlaying = state == kFsAudioStreamPlaying;
[weakSelf.progressTimer setPaused:!(state == kFsAudioStreamPlaying)];
switch (state) {
case kFsAudioStreamRetrievingURL:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
......@@ -46,7 +46,7 @@
break;
case kFsAudioStreamStopped:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
DSLog(@"kFsAudioStreamStopped --- 停止播放了 ");
DSLog(@"kFsAudioStreamStopped --- 停止播放了");
break;
case kFsAudioStreamBuffering: {
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
......@@ -62,7 +62,7 @@
break;
case kFsAudioStreamPlaying:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
DSLog(@"播放ing -- ");
DSLog(@"播放ing...");
break;
case kFsAudioStreamFailed:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
......@@ -98,51 +98,49 @@
self.progressTimer = nil;
}
#pragma mark - private
- (void)updateProgress {
if (self.isDraging == YES) return;
FSStreamPosition cur = self.audioStream.currentTimePlayed;
FSStreamPosition end = self.audioStream.duration;
// 音频播放进度、音频当前播放时间、音频总时间
// 更新音频播放进度、音频当前播放时间、音频总时间
[self.playerView updateProgress:cur.position currentTime:[NSString stringWithFormat:@"%02i:%02i", cur.minute, cur.second] totalTime:[NSString stringWithFormat:@"%02i:%02i", end.minute, end.second]];
}
- (void)audioStreamPlaybackCompleted {
DSLog(@"kFsAudioStreamPlaybackCompleted -- 回放完成");
[self.progressTimer setPaused:YES];
if (self.playerView.mode == SoundPlayModeSingle) { // 单节播放
// 判断是否有下一首
if (self.currentIndex < self.playAudios.count - 1) {
self.currentIndex++;
SubAudioModel *audioModel = self.playAudios[self.currentIndex];
[self.playerView updatePlayerView:audioModel];
[self.audioStream playFromURL:[NSURL URLWithString:audioModel.audio_url]];
[self.progressTimer setPaused:NO];
} else {
FSStreamPosition pos = {0};
pos.position = 0;
[self.audioStream seekToPosition:pos];
FSStreamPosition end = self.audioStream.duration;
[self.playerView updateProgress:0 currentTime:@"00:00" totalTime:[NSString stringWithFormat:@"%02i:%02i", end.minute, end.second]];
}
if (self.playerView.mode == SoundPlayModeSingle) { // 单节播放:播放完当前音频就自动停止了
[self reset];
} else if (self.playerView.mode == SoundPlayModeCycle) { // 单曲循环
[self.audioStream play];
[self.progressTimer setPaused:NO];
} else if (self.playerView.mode == SoundPlayModeOrder) { // 顺序播放
// 获取下一首需要播放的音频
// 播放列表最后一个音频
if (self.currentIndex + 1 >= self.playAudios.count) {
self.currentIndex = 0;
[self reset];
} else {
// 获取下一首需要播放的音频
self.currentIndex++;
[self launchPlayer];
}
SubAudioModel *audioModel = self.playAudios[self.currentIndex];
[self.playerView updatePlayerView:audioModel];
[self.audioStream playFromURL:[NSURL URLWithString:audioModel.audio_url]];
[self.progressTimer setPaused:NO];
}
}
- (void)reset {
FSStreamPosition pos = {0};
pos.position = 0;
[self.audioStream seekToPosition:pos];
FSStreamPosition end = self.audioStream.duration;
[self.playerView updateProgress:0 currentTime:@"00:00" totalTime:[NSString stringWithFormat:@"%02i:%02i", end.minute, end.second]];
}
- (void)launchPlayer {
SubAudioModel *audioModel = self.playAudios[self.currentIndex];
[self.playerView updatePlayerView:audioModel];
[self.audioStream playFromURL:[NSURL URLWithString:audioModel.audio_url]];
}
#pragma mark - MusicPlayerViewDelegate
- (void)didSliderTouchBegan:(float)value {
self.isDraging = YES;
......@@ -163,9 +161,44 @@
self.isDraging = YES;
}
- (void)didClickPlayBtn {
// 播放和暂停是同一个方法
[self.audioStream pause];
- (void)playControlActionWithItem:(UIButton *)item {
switch (item.tag) {
case 1: // 上一首
{
if (self.currentIndex - 1 < 0) {
[DSProgressHUD showToast:@"没有上一首了"];
return;
}
self.currentIndex--;
[self launchPlayer];
}
break;
case 2: // 播放暂停
{
if (self.streamState == kFsAudioStreamStopped) {
[self.audioStream play];
} else if (self.streamState == kFsAudioStreamPlaying) {
// 暂停播放
[self.audioStream pause];
} else if (self.streamState == kFsAudioStreamPaused) {
// 恢复播放
[self.audioStream pause];
}
}
break;
case 3: // 下一首
{
if (self.currentIndex + 1 >= self.playAudios.count) {
[DSProgressHUD showToast:@"没有下一首了"];
return;
}
self.currentIndex++;
[self launchPlayer];
}
break;
default:
break;
}
}
#pragma mark - 隐藏导航栏
......
......@@ -21,8 +21,9 @@ NS_ASSUME_NONNULL_BEGIN
- (void)didSliderTouchEnded:(float)value;
- (void)didSliderValueChange:(float)value;
/// 点击播放按钮事件
- (void)didClickPlayBtn;
/// 上一首、播放、下一首事件
/// @param item item
- (void)playControlActionWithItem:(UIButton *)item;
@end
/// 音频播放页面
......
......@@ -178,9 +178,9 @@
}
}
- (void)playerBtnClick:(UIButton *)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(didClickPlayBtn)]) {
[self.delegate didClickPlayBtn];
- (void)playControlAction:(UIButton *)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(playControlActionWithItem:)]) {
[self.delegate playControlActionWithItem:sender];
}
}
......@@ -275,7 +275,8 @@
- (UIButton *)playerBtn {
if (!_playerBtn) {
_playerBtn = [UIButton new];
[_playerBtn addTarget:self action:@selector(playerBtnClick:) forControlEvents:UIControlEventTouchUpInside];
_playerBtn.tag = 2;
[_playerBtn addTarget:self action:@selector(playControlAction:) forControlEvents:UIControlEventTouchUpInside];
[_playerBtn dk_setBackgroundImage:DKImagePickerWithNames(@"audio_play_icon", @"dk_audio_play_icon", @"dk_audio_play_icon") forState:UIControlStateNormal];
[_playerBtn dk_setBackgroundImage:DKImagePickerWithNames(@"audio_pause", @"dk_audio_pause", @"dk_audio_pause") forState:UIControlStateSelected];
}
......@@ -285,7 +286,8 @@
- (UIButton *)leftPlayBtn {
if (!_leftPlayBtn) {
_leftPlayBtn = [UIButton new];
[_leftPlayBtn addTarget:self action:@selector(leftPlayBtnClick:) forControlEvents:UIControlEventTouchUpInside];
_leftPlayBtn.tag = 1;
[_leftPlayBtn addTarget:self action:@selector(playControlAction:) forControlEvents:UIControlEventTouchUpInside];
[_leftPlayBtn setBackgroundImage:[UIImage imageNamed:@"previous_icon"] forState:UIControlStateNormal];
}
return _leftPlayBtn;
......@@ -294,7 +296,8 @@
- (UIButton *)rightPlayBtn {
if (!_rightPlayBtn) {
_rightPlayBtn = [UIButton new];
[_rightPlayBtn addTarget:self action:@selector(rightPlayBtnClick:) forControlEvents:UIControlEventTouchUpInside];
_rightPlayBtn.tag = 3;
[_rightPlayBtn addTarget:self action:@selector(playControlAction:) forControlEvents:UIControlEventTouchUpInside];
[_rightPlayBtn setBackgroundImage:[UIImage imageNamed:@"next_icon"] forState:UIControlStateNormal];
}
return _rightPlayBtn;
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!