@capgo/native-audio 8.3.18 → 8.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -12,7 +12,7 @@ enum MyError: Error {
|
|
|
12
12
|
@objc(NativeAudio)
|
|
13
13
|
// swiftlint:disable:next type_body_length
|
|
14
14
|
public class NativeAudio: CAPPlugin, AVAudioPlayerDelegate, CAPBridgedPlugin {
|
|
15
|
-
private let pluginVersion: String = "8.
|
|
15
|
+
private let pluginVersion: String = "8.4.0"
|
|
16
16
|
public let identifier = "NativeAudio"
|
|
17
17
|
public let jsName = "NativeAudio"
|
|
18
18
|
public let pluginMethods: [CAPPluginMethod] = [
|
|
@@ -310,9 +310,93 @@ public class NativeAudio: CAPPlugin, AVAudioPlayerDelegate, CAPBridgedPlugin {
|
|
|
310
310
|
}
|
|
311
311
|
return .success
|
|
312
312
|
}
|
|
313
|
+
|
|
314
|
+
// Skip forward command
|
|
315
|
+
commandCenter.skipForwardCommand.preferredIntervals = [NSNumber(value: 15)]
|
|
316
|
+
commandCenter.skipForwardCommand.isEnabled = true
|
|
317
|
+
commandCenter.skipForwardCommand.addTarget { [weak self] event in
|
|
318
|
+
guard let self else { return .commandFailed }
|
|
319
|
+
guard let skipEvent = event as? MPSkipIntervalCommandEvent else { return .commandFailed }
|
|
320
|
+
return self.handleSeekCommand(delta: skipEvent.interval)
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Skip backward command
|
|
324
|
+
commandCenter.skipBackwardCommand.preferredIntervals = [NSNumber(value: 15)]
|
|
325
|
+
commandCenter.skipBackwardCommand.isEnabled = true
|
|
326
|
+
commandCenter.skipBackwardCommand.addTarget { [weak self] event in
|
|
327
|
+
guard let self else { return .commandFailed }
|
|
328
|
+
guard let skipEvent = event as? MPSkipIntervalCommandEvent else { return .commandFailed }
|
|
329
|
+
return self.handleSeekCommand(delta: -skipEvent.interval)
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Scrub / change position command
|
|
333
|
+
commandCenter.changePlaybackPositionCommand.isEnabled = true
|
|
334
|
+
commandCenter.changePlaybackPositionCommand.addTarget { [weak self] event in
|
|
335
|
+
guard let self else { return .commandFailed }
|
|
336
|
+
guard let positionEvent = event as? MPChangePlaybackPositionCommandEvent else { return .commandFailed }
|
|
337
|
+
return self.handleSeekCommand(targetTime: positionEvent.positionTime)
|
|
338
|
+
}
|
|
313
339
|
}
|
|
314
340
|
// swiftlint:enable function_body_length
|
|
315
341
|
|
|
342
|
+
private func handleSeekCommand(delta: TimeInterval? = nil, targetTime: TimeInterval? = nil) -> MPRemoteCommandHandlerStatus {
|
|
343
|
+
guard let assetId = currentlyPlayingAssetId else {
|
|
344
|
+
return .noSuchContent
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
var asset: AudioAsset?
|
|
348
|
+
audioQueue.sync {
|
|
349
|
+
asset = audioList[assetId] as? AudioAsset
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
guard let audioAsset = asset else {
|
|
353
|
+
return .noSuchContent
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
let duration = audioAsset.getDuration()
|
|
357
|
+
let currentTime = audioAsset.getCurrentTime()
|
|
358
|
+
let requestedTime: TimeInterval
|
|
359
|
+
|
|
360
|
+
if let delta {
|
|
361
|
+
requestedTime = currentTime + delta
|
|
362
|
+
} else if let targetTime {
|
|
363
|
+
requestedTime = targetTime
|
|
364
|
+
} else {
|
|
365
|
+
return .commandFailed
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
let clampedTime: TimeInterval
|
|
369
|
+
if duration.isFinite && duration > 0 {
|
|
370
|
+
clampedTime = min(max(requestedTime, 0), duration)
|
|
371
|
+
} else {
|
|
372
|
+
clampedTime = max(requestedTime, 0)
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
audioAsset.setCurrentTime(time: clampedTime) { [weak self, weak audioAsset] in
|
|
376
|
+
guard let self else { return }
|
|
377
|
+
let isPlaying = audioAsset?.isPlaying() ?? false
|
|
378
|
+
let durationValue = duration.isFinite && duration > 0 ? duration : nil
|
|
379
|
+
|
|
380
|
+
if self.showNotification,
|
|
381
|
+
self.currentlyPlayingAssetId == assetId {
|
|
382
|
+
self.updatePlaybackState(
|
|
383
|
+
isPlaying: isPlaying,
|
|
384
|
+
elapsedTime: clampedTime,
|
|
385
|
+
duration: durationValue
|
|
386
|
+
)
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Emit a currentTime event so JS can sync UI immediately after remote seek.
|
|
390
|
+
let roundedTime = round(clampedTime * 10) / 10
|
|
391
|
+
self.notifyListeners("currentTime", data: [
|
|
392
|
+
"currentTime": roundedTime,
|
|
393
|
+
"assetId": assetId
|
|
394
|
+
])
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
return .success
|
|
398
|
+
}
|
|
399
|
+
|
|
316
400
|
@objc func setDebugMode(_ call: CAPPluginCall) {
|
|
317
401
|
let debug = call.getBool("enabled") ?? false
|
|
318
402
|
Logger.debugModeEnabled = debug
|