@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.3.18"
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capgo/native-audio",
3
- "version": "8.3.18",
3
+ "version": "8.4.0",
4
4
  "description": "A native plugin for native audio engine",
5
5
  "license": "MPL-2.0",
6
6
  "main": "dist/plugin.cjs.js",