Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
陈高翔
/
DreamSleep-iOS
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 7de32c40
由
cgx
编写于
2022-05-15 22:09:12 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
使用系统AVPlayer解决播放点击卡顿问题
1 个父辈
4583f834
显示空白字符变更
内嵌
并排
正在显示
17 个修改的文件
包含
330 行增加
和
146 行删除
DreamSleep/DreamSleep.xcodeproj/project.pbxproj
DreamSleep/DreamSleep/Class/HomeModule/Course/View/AudioCourseCell.m
DreamSleep/DreamSleep/Class/HomeModule/Home/Controller/HomeViewController.m
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Controller/NoiseListController.m
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoiseAudioModel.h
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoiseDataManager.h
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoiseDataManager.m
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoisePlayItem.h
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoisePlayItem.m
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoisePlayerManager.h
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoisePlayerManager.m
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/View/NoiseAudioCell.h
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/View/NoisePlayBar.m
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/View/NoisePlayCell.h
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/View/NoisePlayCell.m
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/View/NoisePlayView.m
DreamSleep/DreamSleep/Class/Start/Root/AppDelegate.m
DreamSleep/DreamSleep.xcodeproj/project.pbxproj
查看文件 @
7de32c4
...
...
@@ -58,6 +58,8 @@
D051032E282A4E9200560A0D /* instant_eternity.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = D051032C282A4E9200560A0D /* instant_eternity.mp3 */; };
D051032F282A4E9200560A0D /* fse.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = D051032D282A4E9200560A0D /* fse.mp3 */; };
D053BEE9280F9E310028CCFC /* CloseAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = D053BEE8280F9E310028CCFC /* CloseAlertView.m */; };
D054CCB52830DE5600420DC4 /* NoisePlayerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D054CCB42830DE5600420DC4 /* NoisePlayerManager.m */; };
D054CCB82830E3AC00420DC4 /* NoisePlayItem.m in Sources */ = {isa = PBXBuildFile; fileRef = D054CCB72830E3AC00420DC4 /* NoisePlayItem.m */; };
D055BEB928250D3400BC11A4 /* CourseCollectionCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D055BEB828250D3400BC11A4 /* CourseCollectionCell.m */; };
D055BEBC28250E8F00BC11A4 /* CourseModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D055BEBB28250E8F00BC11A4 /* CourseModel.m */; };
D055BEBF2825267C00BC11A4 /* DSBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D055BEBE2825267C00BC11A4 /* DSBaseViewController.m */; };
...
...
@@ -122,7 +124,6 @@
D0A75108282E2A8500589B0E /* NoisePlayBar.m in Sources */ = {isa = PBXBuildFile; fileRef = D0A75107282E2A8500589B0E /* NoisePlayBar.m */; };
D0A7510E282E2FEF00589B0E /* NoisePlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = D0A7510D282E2FEF00589B0E /* NoisePlayView.m */; };
D0A75111282E3D0D00589B0E /* NoisePlayCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D0A75110282E3D0D00589B0E /* NoisePlayCell.m */; };
D0A75115282E499200589B0E /* NoiseDataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D0A75114282E499200589B0E /* NoiseDataManager.m */; };
D0AE1E3528281B6F008CEF27 /* TimerProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AE1E3428281B6F008CEF27 /* TimerProxy.m */; };
D0AEFE79281781CF00230DC6 /* MyFeedModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AEFE78281781CF00230DC6 /* MyFeedModel.m */; };
D0AEFE7C2817D13400230DC6 /* UITableViewCell+CardRadius.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AEFE7A2817D13400230DC6 /* UITableViewCell+CardRadius.m */; };
...
...
@@ -279,6 +280,10 @@
D051032D282A4E9200560A0D /* fse.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = fse.mp3; sourceTree = "<group>"; };
D053BEE7280F9E310028CCFC /* CloseAlertView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CloseAlertView.h; sourceTree = "<group>"; };
D053BEE8280F9E310028CCFC /* CloseAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CloseAlertView.m; sourceTree = "<group>"; };
D054CCB32830DE5600420DC4 /* NoisePlayerManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NoisePlayerManager.h; sourceTree = "<group>"; };
D054CCB42830DE5600420DC4 /* NoisePlayerManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NoisePlayerManager.m; sourceTree = "<group>"; };
D054CCB62830E3AC00420DC4 /* NoisePlayItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NoisePlayItem.h; sourceTree = "<group>"; };
D054CCB72830E3AC00420DC4 /* NoisePlayItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NoisePlayItem.m; sourceTree = "<group>"; };
D055BEB728250D3400BC11A4 /* CourseCollectionCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CourseCollectionCell.h; sourceTree = "<group>"; };
D055BEB828250D3400BC11A4 /* CourseCollectionCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CourseCollectionCell.m; sourceTree = "<group>"; };
D055BEBA28250E8F00BC11A4 /* CourseModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CourseModel.h; sourceTree = "<group>"; };
...
...
@@ -410,8 +415,6 @@
D0A7510F282E3D0D00589B0E /* NoisePlayCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NoisePlayCell.h; sourceTree = "<group>"; };
D0A75110282E3D0D00589B0E /* NoisePlayCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NoisePlayCell.m; sourceTree = "<group>"; };
D0A75112282E493D00589B0E /* Singleton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Singleton.h; sourceTree = "<group>"; };
D0A75113282E499200589B0E /* NoiseDataManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NoiseDataManager.h; sourceTree = "<group>"; };
D0A75114282E499200589B0E /* NoiseDataManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NoiseDataManager.m; sourceTree = "<group>"; };
D0AE1E3328281B6F008CEF27 /* TimerProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TimerProxy.h; sourceTree = "<group>"; };
D0AE1E3428281B6F008CEF27 /* TimerProxy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TimerProxy.m; sourceTree = "<group>"; };
D0AEFE77281781CF00230DC6 /* MyFeedModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyFeedModel.h; sourceTree = "<group>"; };
...
...
@@ -1137,12 +1140,14 @@
D0D20C42282F68EE00C9374D /* Model */ = {
isa = PBXGroup;
children = (
D054CCB62830E3AC00420DC4 /* NoisePlayItem.h */,
D054CCB72830E3AC00420DC4 /* NoisePlayItem.m */,
D01BD426282C003900BA86B3 /* NoiseTypeModel.h */,
D01BD427282C003900BA86B3 /* NoiseTypeModel.m */,
D01BD429282C03FC00BA86B3 /* NoiseAudioModel.h */,
D01BD42A282C03FC00BA86B3 /* NoiseAudioModel.m */,
D0
A75113282E499200589B0E /* NoiseData
Manager.h */,
D0
A75114282E499200589B0E /* NoiseData
Manager.m */,
D0
54CCB32830DE5600420DC4 /* NoisePlayer
Manager.h */,
D0
54CCB42830DE5600420DC4 /* NoisePlayer
Manager.m */,
);
path = Model;
sourceTree = "<group>";
...
...
@@ -1622,6 +1627,7 @@
D01C9D7028168BFC00163567 /* NSDate+Extension.m in Sources */,
D0F9AC582826602400FD7A3B /* SPButton.m in Sources */,
D0DB33A528204E7C00E15914 /* FirstLeadAlertView.m in Sources */,
D054CCB82830E3AC00420DC4 /* NoisePlayItem.m in Sources */,
D0C50B3027FD1BEB00DC68F0 /* PrivacyView.m in Sources */,
D0B5ECD527F2F0B2003EDFE3 /* AdaptationUtil.m in Sources */,
D070509A28071BAF006D72E1 /* DSNetworkTool.m in Sources */,
...
...
@@ -1680,6 +1686,7 @@
D0F9AC542826563400FD7A3B /* MusicPlayerController.m in Sources */,
D0A72E3C282B56E600EED7BE /* GoodSleepSoundCell.m in Sources */,
D0506B1528051ED400229278 /* SafeSleepModel.m in Sources */,
D054CCB52830DE5600420DC4 /* NoisePlayerManager.m in Sources */,
D0874BBF2816E61000CECB3C /* RescuePlanView.m in Sources */,
D07DACA42810557D0067A1BF /* CGGeometry+RSKImageCropper.m in Sources */,
D09D0E96280D3FE9008DEDAB /* NSDate+Extras.m in Sources */,
...
...
@@ -1715,7 +1722,6 @@
D0B5ECC827F2E97A003EDFE3 /* MacroFuncUtil.m in Sources */,
D055BEB928250D3400BC11A4 /* CourseCollectionCell.m in Sources */,
D01814E227FFDBB800583D4E /* HomeHeaderView.m in Sources */,
D0A75115282E499200589B0E /* NoiseDataManager.m in Sources */,
D055BEBC28250E8F00BC11A4 /* CourseModel.m in Sources */,
D09BF33A280E94E300E5F06C /* LoginUtils.m in Sources */,
D0F808F52803D4E70097899F /* Track.m in Sources */,
...
...
DreamSleep/DreamSleep/Class/HomeModule/Course/View/AudioCourseCell.m
查看文件 @
7de32c4
DreamSleep/DreamSleep/Class/HomeModule/Home/Controller/HomeViewController.m
查看文件 @
7de32c4
...
...
@@ -15,7 +15,7 @@
#import "SafeSleepRequestModel.h"
#import "WhiteNoiseRequestModel.h"
#import "NoisePlayBar.h"
#import "Noise
Data
Manager.h"
#import "Noise
Player
Manager.h"
@interface
HomeViewController
()
@property
(
nonatomic
,
strong
)
DSHomeView
*
homeTV
;
...
...
@@ -62,7 +62,7 @@
-
(
void
)
viewDidDisappear
:
(
BOOL
)
animated
{
[
super
viewDidDisappear
:
animated
];
[[
Noise
DataManager
sharedNoiseDataManager
]
stopNoiseAudio
];
[[
Noise
PlayerManager
sharedNoisePlayerManager
]
stopAll
];
}
-
(
void
)
dealloc
{
...
...
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Controller/NoiseListController.m
查看文件 @
7de32c4
...
...
@@ -7,8 +7,7 @@
#import "NoiseListController.h"
#import "WhiteNoiseRequestModel.h"
#import "NoiseAudioCell.h"
#import "NoiseDataManager.h"
#import "NoisePlayerManager.h"
@interface
NoiseListController
()
<
UICollectionViewDelegate
,
UICollectionViewDataSource
>
@property
(
nonatomic
,
strong
)
UICollectionView
*
noiseAudioView
;
...
...
@@ -44,11 +43,7 @@
self
.
noiseAudioArr
=
requestModel
.
noiseAudioArr
;
[
self
.
noiseAudioView
reloadData
];
// 重置
NSArray
*
playList
=
[
NoiseDataManager
sharedNoiseDataManager
].
playList
;
for
(
NoiseAudioCell
*
audioCell
in
playList
)
{
[
audioCell
.
model
.
audioStream
stop
];
}
[
NoiseDataManager
sharedNoiseDataManager
].
playList
=
@[];
[[
NoisePlayerManager
sharedNoisePlayerManager
]
removeAllNoiseAudioCell
];
}
else
{
self
.
exceptionView
.
hidden
=
NO
;
}
...
...
@@ -85,31 +80,20 @@
NoiseAudioModel
*
model
=
[
self
.
noiseAudioArr
objectAtIndex
:
indexPath
.
row
];
NoiseAudioCell
*
cell
=
(
NoiseAudioCell
*
)[
collectionView
cellForItemAtIndexPath
:[
NSIndexPath
indexPathForRow
:
indexPath
.
row
inSection
:
0
]];
NSArray
*
playList
=
[
NoiseDataManager
sharedNoiseDataManager
].
playList
;
NSMutableArray
*
selectedDataArr
=
[
NSMutableArray
arrayWithArray
:
playList
];
// 白噪音未被选择则添加到播放列表
if
(
cell
.
audioIV
.
selected
==
NO
)
{
if
(
selectedDataArr
.
count
>=
8
)
{
if
(
[
NoisePlayerManager
sharedNoisePlayerManager
].
playCellList
.
count
>=
8
)
{
[
DSProgressHUD
showToast
:
@"音频最多同时播放8个"
];
return
;
}
// 添加播放器
FSAudioStream
*
audioStream
=
[[
FSAudioStream
alloc
]
init
];
audioStream
.
strictContentTypeChecking
=
NO
;
audioStream
.
defaultContentType
=
@"audio/mpeg"
;
audioStream
.
volume
=
.
5
;
model
.
audioStream
=
audioStream
;
[
selectedDataArr
addObject
:
cell
];
playList
=
[
selectedDataArr
copy
];
NoisePlayItem
*
playItem
=
[[
NoisePlayItem
alloc
]
initWithUrl
:
model
.
audio_url
volume
:.
5
];
cell
.
playItem
=
playItem
;
[[
NoisePlayerManager
sharedNoisePlayerManager
]
addNoiseAudioCell
:
cell
];
}
else
{
// 白噪音已经选择了则从播放列表移除
if
(
model
.
audioStream
)
{
[
model
.
audioStream
stop
];
}
[
selectedDataArr
removeObject
:
cell
];
cell
.
playItem
=
nil
;
[[
NoisePlayerManager
sharedNoisePlayerManager
]
removeNoiseAudioCell
:
cell
];
}
cell
.
audioIV
.
selected
=
!
cell
.
audioIV
.
selected
;
[
NoiseDataManager
sharedNoiseDataManager
].
playList
=
[
selectedDataArr
copy
];
}
#pragma mark - lazy
...
...
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoiseAudioModel.h
查看文件 @
7de32c4
...
...
@@ -6,8 +6,6 @@
//
#import <Foundation/Foundation.h>
#import <FSAudioController.h>
#import "NoiseDataManager.h"
NS_ASSUME_NONNULL_BEGIN
...
...
@@ -25,9 +23,6 @@ NS_ASSUME_NONNULL_BEGIN
@property
(
nonatomic
,
copy
)
NSString
*
audio_url
;
// 是否推荐(默认0:不推荐,1:推荐)
@property
(
nonatomic
,
copy
)
NSString
*
is_recommend
;
/// 播放器
@property
(
nonatomic
,
strong
)
FSAudioStream
*
audioStream
;
@end
NS_ASSUME_NONNULL_END
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoiseDataManager.h
deleted
100644 → 0
查看文件 @
4583f83
//
// NoiseDataManager.h
// DreamSleep
//
// Created by peter on 2022/5/13.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/// 白噪音音频数据共享单例对象
@interface
NoiseDataManager
:
NSObject
SingletonH
(
NoiseDataManager
)
/// 选中的白噪音数据
@property
(
nonatomic
,
strong
)
NSArray
*
playList
;
/// 停止所有白噪音播放
-
(
void
)
stopNoiseAudio
;
@end
NS_ASSUME_NONNULL_END
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoiseDataManager.m
deleted
100644 → 0
查看文件 @
4583f83
//
// NoiseDataManager.m
// DreamSleep
//
// Created by peter on 2022/5/13.
//
#import "NoiseDataManager.h"
#import "NoiseAudioCell.h"
@implementation
NoiseDataManager
SingletonM
(
NoiseDataManager
)
-
(
void
)
setPlayList
:
(
NSArray
*
)
playList
{
_playList
=
playList
;
[[
NSNotificationCenter
defaultCenter
]
postNotificationName
:
NoisePlaylistHasChange
object
:
nil
userInfo
:
@{
@"playList"
:
self
.
playList
}];
}
-
(
void
)
stopNoiseAudio
{
if
(
self
.
playList
&&
self
.
playList
.
count
)
{
for
(
int
i
=
0
;
i
<
self
.
playList
.
count
;
i
++
)
{
NoiseAudioCell
*
audioCell
=
self
.
playList
[
i
];
[
audioCell
.
model
.
audioStream
stop
];
}
}
}
@end
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoisePlayItem.h
0 → 100644
查看文件 @
7de32c4
//
// NoisePlayItem.h
// DreamSleep
//
// Created by peter on 2022/5/15.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/// 白噪音播放对象
@interface
NoisePlayItem
:
NSObject
/// 播放状态(YES:正在播放中...,NO:未播放)
@property
(
nonatomic
,
assign
)
BOOL
isPlaying
;
/// 是否循环播放
@property
(
nonatomic
,
assign
)
BOOL
isLoopPlayback
;
/// 是否无缝循环播放
@property
(
nonatomic
,
assign
)
BOOL
isSeamlessLoopPlayback
;
/// 音频资源链接
@property
(
nonatomic
,
copy
)
NSString
*
url
;
/// 音频音量大小
@property
(
nonatomic
,
assign
)
float
volume
;
-
(
instancetype
)
initWithUrl
:(
NSString
*
)
url
volume
:(
float
)
volume
;
-
(
void
)
play
;
-
(
void
)
pause
;
-
(
void
)
stop
;
@end
NS_ASSUME_NONNULL_END
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoisePlayItem.m
0 → 100644
查看文件 @
7de32c4
//
// NoisePlayItem.m
// DreamSleep
//
// Created by peter on 2022/5/15.
//
#import "NoisePlayItem.h"
#import <AVFoundation/AVFoundation.h>
#import "NoisePlayerManager.h"
@interface
NoisePlayItem
()
/// 系统播放器
@property
(
nonatomic
,
strong
)
AVPlayer
*
player
;
/// 无缝循环播放辅助播放器
@property
(
nonatomic
,
strong
)
AVPlayer
*
assistPlayer
;
@end
@implementation
NoisePlayItem
-
(
instancetype
)
initWithUrl
:(
NSString
*
)
url
volume
:(
float
)
volume
{
if
(
self
=
[
super
init
])
{
self
.
url
=
url
;
self
.
volume
=
volume
;
}
return
self
;
}
-
(
void
)
setVolume
:(
float
)
volume
{
_volume
=
volume
;
self
.
player
.
volume
=
volume
;
}
-
(
void
)
play
{
if
(
self
.
player
.
timeControlStatus
!=
AVPlayerTimeControlStatusPlaying
)
{
[
self
.
player
play
];
}
}
-
(
void
)
pause
{
if
(
self
.
player
.
timeControlStatus
==
AVPlayerTimeControlStatusPlaying
)
{
[
self
.
player
pause
];
}
}
-
(
void
)
stop
{
if
(
self
.
player
.
timeControlStatus
==
AVPlayerTimeControlStatusPlaying
)
{
[
self
.
player
pause
];
[
self
.
player
seekToTime
:
CMTimeMake
(
0
,
1
)];
}
}
-
(
void
)
observeValueForKeyPath
:
(
NSString
*
)
keyPath
ofObject
:
(
id
)
object
change
:
(
NSDictionary
*
)
change
context
:
(
void
*
)
context
{
if
([
keyPath
isEqualToString
:
@"status"
])
{
DSLog
(
@"changechange:%@"
,
change
);
AVPlayerStatus
status
=
[[
change
objectForKey
:
@"new"
]
intValue
];
if
(
status
==
AVPlayerStatusReadyToPlay
)
{
self
.
isPlaying
=
YES
;
[
NoisePlayerManager
sharedNoisePlayerManager
].
isPlaying
=
self
.
isPlaying
;
}
else
if
(
status
==
AVPlayerStatusFailed
)
{
self
.
isPlaying
=
NO
;
DSLog
(
@"AVPlayerStatusFailed"
);
}
else
{
self
.
isPlaying
=
NO
;
DSLog
(
@"AVPlayerStatusUnknown"
);
}
}
else
if
([
keyPath
isEqualToString
:
@"loadedTimeRanges"
])
{
DSLog
(
@"change:%@"
,
change
);
}
}
-
(
void
)
playbackFinished
:
(
NSNotification
*
)
notification
{
DSLog
(
@"音频播放完成通知:%@"
,
notification
.
object
);
AVPlayerItem
*
playerItem
=
[
notification
object
];
[
playerItem
seekToTime
:
kCMTimeZero
completionHandler
:
nil
];
[
self
.
player
play
];
// if ([notification.object isEqualToString:@"major"]) {
// self.isPlaying = NO;
// AVPlayerItem *playerItem = [notification object];
// [playerItem seekToTime:kCMTimeZero completionHandler:nil];
// if (self.isLoopPlayback) {
// [self.player play];
// }
// if (self.isSeamlessLoopPlayback) {
// [self.assistPlayer play];
// }
// }
}
-
(
void
)
dealloc
{
[
_player
.
currentItem
removeObserver
:
self
forKeyPath
:
@"status"
context
:
nil
];
[
_player
.
currentItem
removeObserver
:
self
forKeyPath
:
@"loadedTimeRanges"
context
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
removeObserver
:
self
name
:
AVPlayerItemDidPlayToEndTimeNotification
object
:
nil
];
}
#pragma mark - lazy
-
(
AVPlayer
*
)
player
{
if
(
!
_player
)
{
_player
=
[[
AVPlayer
alloc
]
initWithURL
:[
NSURL
URLWithString
:
self
.
url
]];
[
_player
.
currentItem
addObserver
:
self
forKeyPath
:
@"status"
options
:
(
NSKeyValueObservingOptionNew
)
context
:
nil
];
[
_player
.
currentItem
addObserver
:
self
forKeyPath
:
@"loadedTimeRanges"
options
:
(
NSKeyValueObservingOptionNew
)
context
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
playbackFinished
:
)
name
:
AVPlayerItemDidPlayToEndTimeNotification
object
:
_player
.
currentItem
];
}
return
_player
;
}
@end
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoisePlayerManager.h
0 → 100644
查看文件 @
7de32c4
//
// NoisePlayerManager.h
// DreamSleep
//
// Created by peter on 2022/5/15.
//
#import <Foundation/Foundation.h>
#import "NoiseAudioCell.h"
NS_ASSUME_NONNULL_BEGIN
/// 白噪音音频播放管理器
@interface
NoisePlayerManager
:
NSObject
SingletonH
(
NoisePlayerManager
)
/// 播放列表,存放被选中的cell对象
@property
(
nonatomic
,
strong
,
readonly
)
NSArray
<
NoiseAudioCell
*>
*
playCellList
;
/// 播放状态(所有播放列表中只要有1个在播放则为YES,全部暂停为NO)
@property
(
nonatomic
,
assign
)
BOOL
isPlaying
;
/// 一键播放
-
(
void
)
playAll
;
/// 一键暂停
-
(
void
)
pauseAll
;
/// 一键停止
-
(
void
)
stopAll
;
-
(
BOOL
)
addNoiseAudioCell
:(
NoiseAudioCell
*
)
cell
;
-
(
BOOL
)
removeNoiseAudioCell
:(
NoiseAudioCell
*
)
cell
;
-
(
void
)
removeAllNoiseAudioCell
;
@end
NS_ASSUME_NONNULL_END
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/Model/NoisePlayerManager.m
0 → 100644
查看文件 @
7de32c4
//
// NoisePlayerManager.m
// DreamSleep
//
// Created by peter on 2022/5/15.
//
#import "NoisePlayerManager.h"
@interface
NoisePlayerManager
()
/// 临时操作使用的可变数组
@property
(
nonatomic
,
strong
)
NSMutableArray
*
tmpArry
;
@end
@implementation
NoisePlayerManager
SingletonM
(
NoisePlayerManager
)
-
(
void
)
setIsPlaying
:
(
BOOL
)
isPlaying
{
_isPlaying
=
isPlaying
;
[[
NSNotificationCenter
defaultCenter
]
postNotificationName
:
@"playStatusNoti"
object
:
nil
userInfo
:
@{
@"isPlaying"
:
@
(
self
.
isPlaying
)}];
}
-
(
NSMutableArray
*
)
tmpArry
{
if
(
!
_tmpArry
)
{
_tmpArry
=
[
NSMutableArray
array
];
}
return
_tmpArry
;
}
-
(
NSArray
<
NoiseAudioCell
*>
*
)
playCellList
{
return
[
self
.
tmpArry
copy
];
}
-
(
void
)
playAll
{
BOOL
isPlaying
=
NO
;
for
(
NoiseAudioCell
*
cell
in
self
.
playCellList
)
{
NoisePlayItem
*
item
=
cell
.
playItem
;
isPlaying
=
item
.
isPlaying
;
[
item
play
];
}
self
.
isPlaying
=
isPlaying
;
}
-
(
void
)
pauseAll
{
for
(
NoiseAudioCell
*
cell
in
self
.
playCellList
)
{
NoisePlayItem
*
item
=
cell
.
playItem
;
[
item
pause
];
}
self
.
isPlaying
=
NO
;
}
-
(
void
)
stopAll
{
for
(
NoiseAudioCell
*
cell
in
self
.
playCellList
)
{
cell
.
audioIV
.
selected
=
NO
;
NoisePlayItem
*
item
=
cell
.
playItem
;
[
item
stop
];
}
self
.
isPlaying
=
NO
;
}
-
(
BOOL
)
addNoiseAudioCell
:
(
NoiseAudioCell
*
)
cell
{
[
self
.
tmpArry
addObject
:
cell
];
[
cell
.
playItem
play
];
[[
NSNotificationCenter
defaultCenter
]
postNotificationName
:
NoisePlaylistHasChange
object
:
nil
];
return
YES
;
}
-
(
BOOL
)
removeNoiseAudioCell
:
(
NoiseAudioCell
*
)
cell
{
if
(
!
[
self
.
tmpArry
containsObject
:
cell
])
{
return
NO
;
}
[
cell
.
playItem
stop
];
[
self
.
tmpArry
removeObject
:
cell
];
[[
NSNotificationCenter
defaultCenter
]
postNotificationName
:
NoisePlaylistHasChange
object
:
nil
];
return
YES
;
}
-
(
void
)
removeAllNoiseAudioCell
{
[
self
stopAll
];
[
self
.
tmpArry
removeAllObjects
];
[[
NSNotificationCenter
defaultCenter
]
postNotificationName
:
NoisePlaylistHasChange
object
:
nil
];
}
@end
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/View/NoiseAudioCell.h
查看文件 @
7de32c4
...
...
@@ -7,8 +7,7 @@
#import <UIKit/UIKit.h>
#import "NoiseAudioModel.h"
NS_ASSUME_NONNULL_BEGIN
#import "NoisePlayItem.h"
/// 白噪音小音频cell
@interface
NoiseAudioCell
:
UICollectionViewCell
...
...
@@ -16,6 +15,6 @@ NS_ASSUME_NONNULL_BEGIN
@property
(
nonatomic
,
strong
)
UIButton
*
audioIV
;
/// 数据model
@property
(
nonatomic
,
strong
)
NoiseAudioModel
*
model
;
/// 播放器
@property
(
nonatomic
,
strong
)
NoisePlayItem
*
playItem
;
@end
NS_ASSUME_NONNULL_END
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/View/NoisePlayBar.m
查看文件 @
7de32c4
...
...
@@ -7,8 +7,8 @@
#import "NoisePlayBar.h"
#import "NoisePlayView.h"
#import "NoiseAudioCell.h"
#import "TimingView.h"
#import "NoisePlayerManager.h"
@interface
NoisePlayBar
()
@property
(
nonatomic
,
strong
)
UIView
*
bgView
;
...
...
@@ -66,6 +66,8 @@
// 添加对单例对象白噪音播放列表变化通知
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
noisePlaylistHasChange
:
)
name
:
NoisePlaylistHasChange
object
:
nil
];
// 监听播放按钮状态通知
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
playStatusNoti
:
)
name
:
@"playStatusNoti"
object
:
nil
];
// 监听定时按钮被点击事件通知
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
openTimingView
)
name
:
NoiseTimingDidClick
object
:
nil
];
}
...
...
@@ -74,6 +76,7 @@
-
(
void
)
dealloc
{
[[
NSNotificationCenter
defaultCenter
]
removeObserver
:
self
name
:
NoisePlaylistHasChange
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
removeObserver
:
self
name
:
@"playStatusNoti"
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
removeObserver
:
self
name
:
NoiseTimingDidClick
object
:
nil
];
[
_timer
invalidate
];
...
...
@@ -84,29 +87,19 @@
#pragma mark - noti
-
(
void
)
noisePlaylistHasChange
:
(
NSNotification
*
)
noti
{
NSArray
*
playList
=
noti
.
userInfo
[
@"playList"
];
if
(
playList
)
{
WS
(
weakSelf
);
NSArray
*
playList
=
[
NoisePlayerManager
sharedNoisePlayerManager
].
playCellList
;
self
.
hidden
=
!
(
playList
.
count
>
0
);
NSMutableString
*
mStr
=
[
NSMutableString
string
];
for
(
int
i
=
0
;
i
<
playList
.
count
;
i
++
)
{
NoiseAudioCell
*
audioCell
=
playList
[
i
];
__weak
FSAudioStream
*
audioStream
=
audioCell
.
model
.
audioStream
;
audioStream
.
onStateChange
=
^
(
FSAudioStreamState
state
)
{
weakSelf
.
playBtn
.
selected
=
state
==
kFsAudioStreamPlaying
;
if
(
self
->
_noisePlayView
)
{
weakSelf
.
noisePlayView
.
selected
=
weakSelf
.
playBtn
.
selected
;
}
// 如果播放完成则重复播放
if
(
state
==
kFsAudioStreamPlaybackCompleted
)
{
[
audioStream
play
];
}
};
[
mStr
appendFormat
:
@"%@%@"
,
audioCell
.
model
.
audio_name
,
(
i
==
playList
.
count
-
1
)
?
@""
:
@","
];
[
audioCell
.
model
.
audioStream
playFromURL
:[
NSURL
URLWithString
:
audioCell
.
model
.
audio_url
]]
;
self
.
playBtn
.
selected
=
[
NoisePlayerManager
sharedNoisePlayerManager
].
isPlaying
;
}
self
.
audioLab
.
text
=
[
mStr
copy
];
}
}
-
(
void
)
playStatusNoti
:
(
NSNotification
*
)
noti
{
self
.
playBtn
.
selected
=
[
NoisePlayerManager
sharedNoisePlayerManager
].
isPlaying
;
}
-
(
void
)
openTimingView
{
...
...
@@ -116,13 +109,10 @@
#pragma mark - Actions
-
(
void
)
playNoiseAudio
:
(
UIButton
*
)
sender
{
sender
.
selected
=
!
sender
.
selected
;
NSArray
*
playList
=
[
NoiseDataManager
sharedNoiseDataManager
].
playList
;
for
(
int
i
=
0
;
i
<
playList
.
count
;
i
++
)
{
NoiseAudioCell
*
audioCell
=
playList
[
i
];
[
audioCell
.
model
.
audioStream
stop
];
if
(
sender
.
selected
)
{
[
audioCell
.
model
.
audioStream
playFromURL
:[
NSURL
URLWithString
:
audioCell
.
model
.
audio_url
]];
}
[[
NoisePlayerManager
sharedNoisePlayerManager
]
playAll
];
}
else
{
[[
NoisePlayerManager
sharedNoisePlayerManager
]
pauseAll
];
}
}
...
...
@@ -194,15 +184,7 @@
// 暂停播放
if
(
weakSelf
.
countTime
==
0
)
{
[
weakSelf
.
timer
setFireDate
:[
NSDate
distantFuture
]];
NSArray
*
playList
=
[
NoiseDataManager
sharedNoiseDataManager
].
playList
;
if
(
playList
)
{
for
(
NoiseAudioCell
*
audioCell
in
playList
)
{
FSAudioStream
*
audioStream
=
audioCell
.
model
.
audioStream
;
if
(
audioStream
.
isPlaying
)
{
[
audioStream
pause
];
}
}
}
[[
NoisePlayerManager
sharedNoisePlayerManager
]
pauseAll
];
weakSelf
.
timeLab
.
text
=
@""
;
return
;
}
...
...
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/View/NoisePlayCell.h
查看文件 @
7de32c4
...
...
@@ -22,6 +22,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface
NoisePlayCell
:
UITableViewCell
@property
(
nonatomic
,
weak
)
id
<
NoisePlayCellDelegate
>
delegate
;
@property
(
nonatomic
,
strong
)
NoiseAudioModel
*
model
;
@property
(
nonatomic
,
assign
)
float
volumn
;
@property
(
nonatomic
,
strong
)
NSIndexPath
*
indexPath
;
@end
...
...
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/View/NoisePlayCell.m
查看文件 @
7de32c4
...
...
@@ -72,7 +72,11 @@
[
self
.
audioIcon
yy_setImageWithURL
:[
NSURL
URLWithString
:
model
.
audio_pic
]
placeholder
:[
UIImage
imageNamed
:
@"basicPlaceholder"
]];
self
.
nameLab
.
text
=
model
.
audio_name
;
self
.
volumeSlider
.
value
=
model
.
audioStream
.
volume
;
}
-
(
void
)
setVolumn
:
(
float
)
volumn
{
_volumn
=
volumn
;
self
.
volumeSlider
.
value
=
volumn
;
}
-
(
void
)
setIndexPath
:
(
NSIndexPath
*
)
indexPath
{
...
...
DreamSleep/DreamSleep/Class/HomeModule/WhiteNoise/View/NoisePlayView.m
查看文件 @
7de32c4
...
...
@@ -8,6 +8,7 @@
#import "NoisePlayView.h"
#import "NoisePlayCell.h"
#import "NoiseAudioCell.h"
#import "NoisePlayerManager.h"
@interface
NoisePlayView
()
<
UITableViewDelegate
,
UITableViewDataSource
,
NoisePlayCellDelegate
>
@property
(
nonatomic
,
strong
)
UIView
*
headView
;
...
...
@@ -38,9 +39,9 @@
-
(
void
)
showNoisePlayViewWith
:
(
BOOL
)
selected
{
[
DSKeyWindow
addSubview
:
self
];
NSArray
*
play
List
=
[
NoiseDataManager
sharedNoiseDataManager
].
play
List
;
if
(
playList
)
{
self
.
audioArr
=
playList
;
NSArray
*
play
CellList
=
[
NoisePlayerManager
sharedNoisePlayerManager
].
playCell
List
;
if
(
play
Cell
List
)
{
self
.
audioArr
=
play
Cell
List
;
[
self
.
playListView
reloadData
];
}
...
...
@@ -54,24 +55,25 @@
#pragma mark - Actions
-
(
void
)
oneClickAction
:
(
UIButton
*
)
sender
{
for
(
NoiseAudioCell
*
audioCell
in
self
.
audioArr
)
{
FSAudioStream
*
audioStream
=
audioCell
.
model
.
audioStream
;
// for (NoiseAudioCell *audioCell in self.audioArr) {
// FSAudioStream *audioStream = audioCell.model.audioStream;
// if (sender.selected) {
// [audioStream stop];
// } else {
// [audioStream play];
// }
// }
sender
.
selected
=
!
sender
.
selected
;
if
(
sender
.
selected
)
{
[
audioStream
stop
];
[[
NoisePlayerManager
sharedNoisePlayerManager
]
playAll
];
}
else
{
[
audioStream
play
];
}
[[
NoisePlayerManager
sharedNoisePlayerManager
]
pauseAll
];
}
sender
.
selected
=
!
sender
.
selected
;
}
-
(
void
)
clearAllAction
:
(
UIButton
*
)
sender
{
for
(
NoiseAudioCell
*
audioCell
in
self
.
audioArr
)
{
[
audioCell
.
model
.
audioStream
stop
];
audioCell
.
audioIV
.
selected
=
NO
;
}
[[
NoisePlayerManager
sharedNoisePlayerManager
]
removeAllNoiseAudioCell
];
self
.
audioArr
=
@[];
[
NoiseDataManager
sharedNoiseDataManager
].
playList
=
self
.
audioArr
;
[
self
.
playListView
reloadData
];
[
self
removeFromSuperview
];
}
...
...
@@ -94,6 +96,7 @@
cell
.
delegate
=
self
;
NoiseAudioCell
*
audioCell
=
self
.
audioArr
[
indexPath
.
row
];
cell
.
model
=
audioCell
.
model
;
cell
.
volumn
=
audioCell
.
playItem
.
volume
;
cell
.
indexPath
=
indexPath
;
return
cell
;
}
...
...
@@ -122,13 +125,12 @@
-
(
void
)
didRemoveItem
:
(
NSIndexPath
*
)
indexPath
{
// 将要删除的音频停止播放并且设置为非选中状态
NoiseAudioCell
*
audioCell
=
self
.
audioArr
[
indexPath
.
row
];
[
audioCell
.
model
.
audioStream
stop
];
audioCell
.
audioIV
.
selected
=
NO
;
// 删除数据源
NSMutableArray
*
tmpArr
=
[
NSMutableArray
arrayWithArray
:
self
.
audioArr
];
[
tmpArr
removeObjectAtIndex
:
indexPath
.
row
];
self
.
audioArr
=
[
tmpArr
copy
];
[
NoiseDataManager
sharedNoiseDataManager
].
playList
=
self
.
audioArr
;
[
[
NoisePlayerManager
sharedNoisePlayerManager
]
removeNoiseAudioCell
:
audioCell
]
;
// 执行删除动画
[
self
.
playListView
deleteRowsAtIndexPaths
:@[
indexPath
]
withRowAnimation
:
UITableViewRowAnimationLeft
];
dispatch_after
(.
1
,
dispatch_get_main_queue
(),
^
{
...
...
@@ -139,7 +141,7 @@
-
(
void
)
didSetVolume
:
(
float
)
volume
indexPath
:
(
NSIndexPath
*
)
indexPath
{
NoiseAudioCell
*
audioCell
=
self
.
audioArr
[
indexPath
.
row
];
[
audioCell
.
model
.
audioStream
setVolume
:
volume
]
;
audioCell
.
playItem
.
volume
=
volume
;
}
#pragma mark - lazy
...
...
DreamSleep/DreamSleep/Class/Start/Root/AppDelegate.m
查看文件 @
7de32c4
...
...
@@ -12,6 +12,7 @@
#import "WXApi.h"
#import <UMCommon/UMCommon.h>
#import <UMShare/UMShare.h>
#import <AVFoundation/AVFoundation.h>
@interface
AppDelegate
()
<
WXApiDelegate
>
@end
...
...
@@ -47,6 +48,11 @@
// 全局适配:iOS15适配UITableView内容自动下移22像素BUG
if
(
@available
(
iOS
15
.
0
,
*
))
{
[
UITableView
appearance
].
sectionHeaderTopPadding
=
0
;
}
// 手机在静音模式下不会影响音频播放
AVAudioSession
*
avSession
=
[
AVAudioSession
sharedInstance
];
[
avSession
setCategory
:
AVAudioSessionCategoryPlayback
error
:
nil
];
[
avSession
setActive
:
YES
error
:
nil
];
return
YES
;
}
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论