Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 347761f

Browse files
update
1 parent 9ddd431 commit 347761f

File tree

2 files changed

+9
-81
lines changed

2 files changed

+9
-81
lines changed

‎Sources/swiftui-loop-videoplayer/protocol/player/AbstractPlayer.swift‎

Lines changed: 4 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ import CoreImage
1616
@MainActor
1717
public protocol AbstractPlayer: AnyObject {
1818

19-
typealias ItemStatusCallback = (AVPlayerItem.Status) -> Void
20-
2119
/// Observes the status property of the new player item.
2220
var itemStatusObserver: NSKeyValueObservation? { get set }
2321

@@ -112,7 +110,7 @@ public protocol AbstractPlayer: AnyObject {
112110
func applyVideoComposition()
113111

114112
/// Updates the current playback asset, settings, and initializes playback or a specific action when the asset is ready.
115-
func update(settings: VideoSettings, doUpdate : Bool, callback :((AVPlayerItem)->Void)?)
113+
func update(settings: VideoSettings, doUpdate : Bool)
116114
}
117115

118116
extension AbstractPlayer{
@@ -204,46 +202,6 @@ extension AbstractPlayer{
204202
return AVPlayerItem(asset: asset)
205203
}
206204
}
207-
208-
/// Clear status observer
209-
func clearStatusObserver(){
210-
guard itemStatusObserver != nil else { return }
211-
itemStatusObserver?.invalidate()
212-
itemStatusObserver = nil
213-
}
214-
215-
/// Sets up an observer for the status of the provided `AVPlayerItem`.
216-
///
217-
/// This method observes changes in the status of `newItem` and triggers the provided callback
218-
/// whenever the status changes to `.readyToPlay` or `.failed`. Once the callback is invoked,
219-
/// the observer is invalidated, ensuring that the callback is called only once.
220-
///
221-
/// - Parameters:
222-
/// - item: The `AVPlayerItem` whose status is to be observed.
223-
/// - callback: A closure that is called when the item's status changes to `.readyToPlay` or `.failed`.
224-
func setupStateStatusObserver(for item: AVPlayerItem, callback : @escaping ItemStatusCallback) {
225-
226-
clearStatusObserver()
227-
228-
guard item.status == .unknown else{
229-
callback(item.status)
230-
return
231-
}
232-
233-
itemStatusObserver = item.observe(\.status, options: [.new, .initial]) { [weak self] observedItem, change in
234-
print(observedItem.status.rawValue, "status")
235-
236-
guard [.readyToPlay, .failed].contains(observedItem.status) else {
237-
return
238-
}
239-
240-
callback(observedItem.status)
241-
242-
Task { @MainActor in
243-
self?.clearStatusObserver()
244-
}
245-
}
246-
}
247205

248206
/// Seeks the video to a specific time in the timeline.
249207
/// This method adjusts the playback position to the specified time with precise accuracy.
@@ -257,7 +215,7 @@ extension AbstractPlayer{
257215
/// Defaults to `false`, meaning playback will remain paused after the seek operation.
258216
func seek(to time: Double, play: Bool = false) {
259217
guard let player = player, let duration = player.currentItem?.duration else {
260-
onUnavailableDuration(for: time, play: play)
218+
delegate?.didSeek(value:false, currentTime: time)
261219
return
262220
}
263221

@@ -266,43 +224,18 @@ extension AbstractPlayer{
266224
return
267225
}
268226

269-
player.seek(to: seekTime, toleranceBefore:.zero, toleranceAfter:.zero) { [weak self] success in
227+
player.seek(to: seekTime) { [weak self] success in
270228
self?.seekCompletion(success: success, autoPlay: play)
271229
}
272230
}
273-
274-
private func onUnavailableDuration(for time: Double, play: Bool) {
275-
guard let settings = currentSettings else {
276-
delegate?.didSeek(value: false, currentTime: time)
277-
return
278-
}
279-
280-
let callback: ItemStatusCallback = { [weak self] status in
281-
if status == .readyToPlay {
282-
self?.seek(to: time, play: play)
283-
} else {
284-
self?.delegate?.didSeek(value: false, currentTime: time)
285-
}
286-
}
287-
288-
update(settings: settings, doUpdate: true) { [weak self] item in
289-
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5){
290-
self?.setupStateStatusObserver(for: item, callback: callback)
291-
}
292-
}
293-
}
294231

295232
private func seekCompletion(success: Bool, autoPlay: Bool) {
296233
guard let player = player else { return }
297234
let currentTime = CMTimeGetSeconds(player.currentTime())
298235

299236
Task { @MainActor in
300237
delegate?.didSeek(value: success, currentTime: currentTime)
301-
if autoPlay {
302-
play()
303-
} else {
304-
pause()
305-
}
238+
autoPlay ? play() : pause()
306239
}
307240
}
308241

‎Sources/swiftui-loop-videoplayer/protocol/player/ExtPlayerProtocol.swift‎

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,10 @@ internal extension ExtPlayerProtocol {
9494
) {
9595

9696
player.isMuted = settings.mute
97-
97+
if !settings.loop{
98+
player.actionAtItemEnd = .pause
99+
}
100+
98101
configurePlayerLayer(player, settings)
99102
configureCompositeLayer(settings)
100103
configureTimePublishing(player, settings)
@@ -174,8 +177,7 @@ internal extension ExtPlayerProtocol {
174177
/// or actions once the asset is prepared.
175178
func update(
176179
settings: VideoSettings,
177-
doUpdate : Bool = false,
178-
callback : ((AVPlayerItem) -> Void)? = nil
180+
doUpdate : Bool = false
179181
) {
180182

181183
if doUpdate == false && settings.isEqual(currentSettings){
@@ -190,8 +192,6 @@ internal extension ExtPlayerProtocol {
190192
return
191193
}
192194

193-
callback?(newItem)
194-
195195
insert(newItem)
196196

197197
if settings.loop{
@@ -249,9 +249,6 @@ internal extension ExtPlayerProtocol {
249249
self?.delegate?.currentItemWasRemoved()
250250
}
251251
}
252-
Task { @MainActor in
253-
self?.clearStatusObserver()
254-
}
255252
}
256253

257254
volumeObserver = player.observe(\.volume, options: [.new, .old]) { [weak self] player, change in
@@ -277,8 +274,6 @@ internal extension ExtPlayerProtocol {
277274

278275
volumeObserver?.invalidate()
279276
volumeObserver = nil
280-
281-
clearStatusObserver()
282277

283278
if let observerToken = timeObserver {
284279
player?.removeTimeObserver(observerToken)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /