expo-audio 58.0.7 → 58.0.9

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.
Files changed (51) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/expo/modules/audio/AudioModule.kt +26 -23
  4. package/android/src/main/java/expo/modules/audio/AudioPlayer.kt +2 -2
  5. package/android/src/main/java/expo/modules/audio/AudioPlaylist.kt +2 -2
  6. package/android/src/main/java/expo/modules/audio/AudioUtils.kt +5 -2
  7. package/android/src/main/java/expo/modules/audio/BaseAudioPlayer.kt +1 -0
  8. package/android/src/main/java/expo/modules/audio/PlayRequestingPlayer.kt +24 -0
  9. package/android/src/main/java/expo/modules/audio/Playable.kt +9 -0
  10. package/android/src/main/java/expo/modules/audio/service/AudioControlsService.kt +9 -6
  11. package/ios/AudioModule.swift +2 -3
  12. package/ios/AudioPlayer.swift +17 -0
  13. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9-sources.jar +0 -0
  14. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9-sources.jar.md5 +1 -0
  15. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9-sources.jar.sha1 +1 -0
  16. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9-sources.jar.sha256 +1 -0
  17. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9-sources.jar.sha512 +1 -0
  18. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.aar +0 -0
  19. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.aar.md5 +1 -0
  20. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.aar.sha1 +1 -0
  21. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.aar.sha256 +1 -0
  22. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.aar.sha512 +1 -0
  23. package/local-maven-repo/expo/modules/audio/expo.modules.audio/{58.0.7/expo.modules.audio-58.0.7.module → 58.0.9/expo.modules.audio-58.0.9.module} +22 -22
  24. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.module.md5 +1 -0
  25. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.module.sha1 +1 -0
  26. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.module.sha256 +1 -0
  27. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.module.sha512 +1 -0
  28. package/local-maven-repo/expo/modules/audio/expo.modules.audio/{58.0.7/expo.modules.audio-58.0.7.pom → 58.0.9/expo.modules.audio-58.0.9.pom} +1 -1
  29. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.pom.md5 +1 -0
  30. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.pom.sha1 +1 -0
  31. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.pom.sha256 +1 -0
  32. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.9/expo.modules.audio-58.0.9.pom.sha512 +1 -0
  33. package/package.json +5 -5
  34. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7-sources.jar +0 -0
  35. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7-sources.jar.md5 +0 -1
  36. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7-sources.jar.sha1 +0 -1
  37. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7-sources.jar.sha256 +0 -1
  38. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7-sources.jar.sha512 +0 -1
  39. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.aar +0 -0
  40. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.aar.md5 +0 -1
  41. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.aar.sha1 +0 -1
  42. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.aar.sha256 +0 -1
  43. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.aar.sha512 +0 -1
  44. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.module.md5 +0 -1
  45. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.module.sha1 +0 -1
  46. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.module.sha256 +0 -1
  47. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.module.sha512 +0 -1
  48. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.pom.md5 +0 -1
  49. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.pom.sha1 +0 -1
  50. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.pom.sha256 +0 -1
  51. package/local-maven-repo/expo/modules/audio/expo.modules.audio/58.0.7/expo.modules.audio-58.0.7.pom.sha512 +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 58.0.9
4
+
5
+ ### Patch Changes
6
+
7
+ - [iOS] Re-apply `preferredForwardBufferDuration` when the player item is replaced or a loop item is queued. ([#50468](https://github.com/expo/expo/pull/50468) by [@rmotafreitas](https://github.com/rmotafreitas))
8
+
9
+ ## 58.0.8
10
+
11
+ ### Patch Changes
12
+
13
+ - [Android] Request audio focus when playback is started from the notification, the lock screen or a media button, so it pauses for an incoming call like playback started from JS. ([#50745](https://github.com/expo/expo/pull/50745) by [@enavermate](https://github.com/enavermate))
14
+
3
15
  ## 58.0.7
4
16
 
5
17
  ### Patch Changes
@@ -4,13 +4,13 @@ plugins {
4
4
  }
5
5
 
6
6
  group = 'expo.modules.audio'
7
- version = '58.0.7'
7
+ version = '58.0.9'
8
8
 
9
9
  android {
10
10
  namespace "expo.modules.audio"
11
11
  defaultConfig {
12
12
  versionCode 1
13
- versionName "58.0.7"
13
+ versionName "58.0.9"
14
14
  }
15
15
 
16
16
  compileOptions {
@@ -294,6 +294,28 @@ class AudioModule : Module() {
294
294
  focusAcquired = false
295
295
  }
296
296
 
297
+ // Called on the main thread, from JS and from outside it (see `Playable.onPlayRequest`).
298
+ private fun playWithAudioFocus(playable: Playable) {
299
+ if (!audioEnabled) {
300
+ Log.e(TAG, "Audio has been disabled. Re-enable to start playing")
301
+ return
302
+ }
303
+ if (!shouldPlayInSilentMode()) {
304
+ return
305
+ }
306
+ val focusResult = requestAudioFocus()
307
+ if (focusResult == AudioFocusResult.FAILED) {
308
+ return
309
+ }
310
+ (playable as? AudioPlayer)?.let { registerAudioSessionActivityKeeper(it) }
311
+ if (focusResult == AudioFocusResult.DELAYED) {
312
+ // The AUDIOFOCUS_GAIN branch starts it once the system grants focus.
313
+ playable.isPaused = true
314
+ return
315
+ }
316
+ playable.play()
317
+ }
318
+
297
319
  private fun registerAudioSessionActivityKeeper(player: AudioPlayer) {
298
320
  if (player.keepAudioSessionActive) {
299
321
  audioSessionActivityKeepers.add(player.id)
@@ -545,6 +567,7 @@ class AudioModule : Module() {
545
567
  releaseAudioFocusIfUnused()
546
568
  }
547
569
  }
570
+ player.onPlayRequest = { playWithAudioFocus(player) }
548
571
  players[player.id] = player
549
572
  player
550
573
  }
@@ -649,19 +672,8 @@ class AudioModule : Module() {
649
672
  }
650
673
 
651
674
  Function("play") { player: AudioPlayer ->
652
- if (!audioEnabled) {
653
- Log.e(TAG, "Audio has been disabled. Re-enable to start playing")
654
- return@Function
655
- }
656
- if (!shouldPlayInSilentMode()) {
657
- return@Function
658
- }
659
675
  runOnMain {
660
- if (requestAudioFocus() == AudioFocusResult.FAILED) {
661
- return@runOnMain
662
- }
663
- registerAudioSessionActivityKeeper(player)
664
- player.ref.play()
676
+ playWithAudioFocus(player)
665
677
  }
666
678
  }
667
679
 
@@ -913,6 +925,7 @@ class AudioModule : Module() {
913
925
  releaseAudioFocusIfUnused()
914
926
  }
915
927
  }
928
+ playlist.onPlayRequest = { playWithAudioFocus(playlist) }
916
929
  playlists[playlist.id] = playlist
917
930
  playlist
918
931
  }
@@ -1015,18 +1028,8 @@ class AudioModule : Module() {
1015
1028
  }
1016
1029
 
1017
1030
  Function("play") { playlist: AudioPlaylist ->
1018
- if (!audioEnabled) {
1019
- Log.e(TAG, "Audio has been disabled. Re-enable to start playing")
1020
- return@Function
1021
- }
1022
- if (!shouldPlayInSilentMode()) {
1023
- return@Function
1024
- }
1025
1031
  runOnMain {
1026
- if (!focusAcquired && requestAudioFocus() == AudioFocusResult.FAILED) {
1027
- return@runOnMain
1028
- }
1029
- playlist.ref.play()
1032
+ playWithAudioFocus(playlist)
1030
1033
  }
1031
1034
  }
1032
1035
 
@@ -66,7 +66,7 @@ class AudioPlayer(
66
66
  override var isActiveForLockScreen = false
67
67
  override var metadata: Metadata? = null
68
68
  override var lockScreenOptions: AudioLockScreenOptions? = null
69
- override var mediaSession: MediaSession = buildBasicMediaSession(context, ref)
69
+ override var mediaSession: MediaSession = buildBasicMediaSession(context, ref) { requestPlay() }
70
70
  override val serviceConnection = AudioPlaybackServiceConnection(WeakReference(this), appContext)
71
71
 
72
72
  override val isLive: Boolean
@@ -202,7 +202,7 @@ class AudioPlayer(
202
202
 
203
203
  override fun assignBasicMediaSession() {
204
204
  mediaSession.release()
205
- mediaSession = buildBasicMediaSession(context, ref)
205
+ mediaSession = buildBasicMediaSession(context, ref) { requestPlay() }
206
206
  }
207
207
 
208
208
  private fun sendAudioSampleUpdate(sample: List<Float>) {
@@ -43,7 +43,7 @@ class AudioPlaylist(
43
43
  override var isActiveForLockScreen = false
44
44
  override var metadata: Metadata? = null
45
45
  override var lockScreenOptions: AudioLockScreenOptions? = null
46
- override var mediaSession: MediaSession = buildBasicMediaSession(context, ref)
46
+ override var mediaSession: MediaSession = buildBasicMediaSession(context, ref) { requestPlay() }
47
47
  override val serviceConnection = AudioPlaybackServiceConnection(WeakReference(this), appContext)
48
48
  override val supportsNextTrack = true
49
49
  override val supportsPreviousTrack = true
@@ -198,7 +198,7 @@ class AudioPlaylist(
198
198
 
199
199
  override fun assignBasicMediaSession() {
200
200
  mediaSession.release()
201
- mediaSession = buildBasicMediaSession(appContext?.reactContext ?: return, ref)
201
+ mediaSession = buildBasicMediaSession(appContext?.reactContext ?: return, ref) { requestPlay() }
202
202
  }
203
203
 
204
204
  override fun currentStatus(): Map<String, Any?> {
@@ -3,7 +3,9 @@ package expo.modules.audio
3
3
  import android.content.Context
4
4
  import android.media.AudioDeviceInfo
5
5
  import android.os.Bundle
6
+ import androidx.annotation.OptIn
6
7
  import androidx.media3.common.Player
8
+ import androidx.media3.common.util.UnstableApi
7
9
  import androidx.media3.session.MediaSession
8
10
  import java.io.File
9
11
  import java.io.IOException
@@ -31,8 +33,9 @@ fun getMapFromDeviceInfo(deviceInfo: AudioDeviceInfo): Bundle {
31
33
  return map
32
34
  }
33
35
 
34
- fun buildBasicMediaSession(context: Context, player: Player): MediaSession {
35
- return MediaSession.Builder(context, player)
36
+ @OptIn(UnstableApi::class)
37
+ fun buildBasicMediaSession(context: Context, player: Player, onPlay: () -> Unit): MediaSession {
38
+ return MediaSession.Builder(context, PlayRequestingPlayer(player, onPlay))
36
39
  .setId("ExpoAudioBasicMediaSession_${player.hashCode()}")
37
40
  .build()
38
41
  }
@@ -41,6 +41,7 @@ abstract class BaseAudioPlayer(
41
41
  override var previousVolume = 1f
42
42
  override var onPlaybackStateChange: ((Boolean) -> Unit)? = null
43
43
  override var onRelease: (() -> Unit)? = null
44
+ override var onPlayRequest: (() -> Unit)? = null
44
45
  override val player get() = ref
45
46
 
46
47
  protected var playerScope = CoroutineScope(Dispatchers.Main)
@@ -0,0 +1,24 @@
1
+ package expo.modules.audio
2
+
3
+ import androidx.media3.common.ForwardingPlayer
4
+ import androidx.media3.common.Player
5
+ import androidx.media3.common.util.UnstableApi
6
+
7
+ // A media session calls `play()` on its player directly, and a Media3 `MediaController` can also
8
+ // start playback with `setPlayWhenReady(true)`. Routing both to `onPlay` lets playback started from
9
+ // the lock screen, a media button or another app request audio focus, like playback started in JS.
10
+ @UnstableApi
11
+ internal class PlayRequestingPlayer(
12
+ player: Player,
13
+ private val onPlay: () -> Unit
14
+ ) : ForwardingPlayer(player) {
15
+ override fun play() = onPlay()
16
+
17
+ override fun setPlayWhenReady(playWhenReady: Boolean) {
18
+ if (playWhenReady) {
19
+ onPlay()
20
+ } else {
21
+ super.setPlayWhenReady(false)
22
+ }
23
+ }
24
+ }
@@ -17,6 +17,13 @@ interface Playable {
17
17
  var onPlaybackStateChange: ((Boolean) -> Unit)?
18
18
  var onRelease: (() -> Unit)?
19
19
 
20
+ /**
21
+ * Starts playback through `AudioModule`, which requests audio focus first. Playback started outside
22
+ * JS (the notification, the lock screen, a headset or Bluetooth button) goes through `requestPlay`
23
+ * too, so the player never plays without holding focus.
24
+ */
25
+ var onPlayRequest: (() -> Unit)?
26
+
20
27
  val player: Player
21
28
  val appContext: AppContext?
22
29
 
@@ -31,6 +38,8 @@ interface Playable {
31
38
 
32
39
  fun play() = player.play()
33
40
 
41
+ fun requestPlay() = onPlayRequest?.invoke() ?: player.play()
42
+
34
43
  fun pause() = player.pause()
35
44
 
36
45
  fun seekTo(seconds: Double) = player.seekTo((seconds * 1000L).toLong())
@@ -26,6 +26,7 @@ import androidx.media3.session.SessionCommand
26
26
  import expo.modules.audio.AudioLockScreenOptions
27
27
  import expo.modules.audio.LockScreenPlayable
28
28
  import expo.modules.audio.Metadata
29
+ import expo.modules.audio.PlayRequestingPlayer
29
30
  import expo.modules.audio.getPlaybackServiceErrorMessage
30
31
  import expo.modules.kotlin.AppContext
31
32
  import kotlinx.coroutines.CoroutineScope
@@ -66,9 +67,10 @@ class AudioControlsService : MediaSessionService() {
66
67
  override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
67
68
  ensureForegroundNotification()
68
69
 
69
- val currentPlayer = currentPlayable?.player
70
+ val playable = currentPlayable
71
+ val currentPlayer = playable?.player
70
72
  val context = appContext
71
- if (currentPlayer == null || context == null) {
73
+ if (playable == null || currentPlayer == null || context == null) {
72
74
  stopForeground(STOP_FOREGROUND_REMOVE)
73
75
  return super.onStartCommand(intent, flags, startId)
74
76
  }
@@ -77,7 +79,7 @@ class AudioControlsService : MediaSessionService() {
77
79
  when (intent?.action) {
78
80
  ACTION_PLAY -> {
79
81
  if (shouldPlayInSilentMode()) {
80
- currentPlayer.play()
82
+ playable.requestPlay()
81
83
  }
82
84
  }
83
85
  ACTION_PAUSE -> currentPlayer.pause()
@@ -85,7 +87,7 @@ class AudioControlsService : MediaSessionService() {
85
87
  if (currentPlayer.isPlaying) {
86
88
  currentPlayer.pause()
87
89
  } else if (shouldPlayInSilentMode()) {
88
- currentPlayer.play()
90
+ playable.requestPlay()
89
91
  }
90
92
 
91
93
  ACTION_SEEK_FORWARD -> seekForward()
@@ -381,12 +383,13 @@ class AudioControlsService : MediaSessionService() {
381
383
  }
382
384
 
383
385
  private fun resolveSessionPlayer(playable: LockScreenPlayable, options: AudioLockScreenOptions?): Player {
386
+ val player = PlayRequestingPlayer(playable.player) { playable.requestPlay() }
384
387
  val isLive = options?.isLiveStream ?: playable.isLive
385
388
  if (!isLive) {
386
- return playable.player
389
+ return player
387
390
  }
388
391
 
389
- return object : ForwardingPlayer(playable.player) {
392
+ return object : ForwardingPlayer(player) {
390
393
  override fun getAvailableCommands(): Player.Commands {
391
394
  return super.getAvailableCommands().buildUpon()
392
395
  .remove(Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)
@@ -136,14 +136,13 @@ public class AudioModule: Module {
136
136
  avPlayer = cachedPlayer
137
137
  } else {
138
138
  avPlayer = AudioUtils.createAVPlayer(from: source)
139
- if preferredForwardBufferDuration > 0 {
140
- avPlayer.currentItem?.preferredForwardBufferDuration = preferredForwardBufferDuration
141
- }
142
139
  }
143
140
  avPlayer.allowsExternalPlayback = allowsExternalPlayback
144
141
  let player = AudioPlayer(avPlayer, interval: updateInterval, source: source)
145
142
  player.owningRegistry = self.registry
146
143
  player.keepAudioSessionActive = keepAudioSessionActive
144
+ // Store the preference so it is re-applied whenever the item is replaced.
145
+ player.preferredForwardBufferDuration = preferredForwardBufferDuration
147
146
  let playerId = player.id
148
147
  player.onRelease = { [weak audioModule = self] in
149
148
  audioModule?.unregisterAudioSessionActivityKeeper(playerId)
@@ -25,6 +25,14 @@ public class AudioPlayer: SharedRef<AVPlayer>, Playable, LockScreenPlayable {
25
25
  }
26
26
  var samplingEnabled = false
27
27
  var keepAudioSessionActive = false
28
+ /// Forward-buffer preference. `AVPlayerItem.preferredForwardBufferDuration` is per item and
29
+ /// resets to the default when the item is replaced (source swap, reconnect, media-services
30
+ /// reset), so the value is stored and re-applied to every new item.
31
+ var preferredForwardBufferDuration: TimeInterval = 0 {
32
+ didSet {
33
+ applyPreferredForwardBufferDuration()
34
+ }
35
+ }
28
36
  var onRelease: (() -> Void)?
29
37
 
30
38
  var isLooping = false {
@@ -208,6 +216,13 @@ public class AudioPlayer: SharedRef<AVPlayer>, Playable, LockScreenPlayable {
208
216
  }
209
217
  }
210
218
 
219
+ private func applyPreferredForwardBufferDuration() {
220
+ guard preferredForwardBufferDuration > 0 else {
221
+ return
222
+ }
223
+ ref.currentItem?.preferredForwardBufferDuration = preferredForwardBufferDuration
224
+ }
225
+
211
226
  private func setupPublisher() {
212
227
  ref.publisher(for: \.currentItem?.status)
213
228
  .sink { [weak self] status in
@@ -239,6 +254,7 @@ public class AudioPlayer: SharedRef<AVPlayer>, Playable, LockScreenPlayable {
239
254
  guard let self else {
240
255
  return
241
256
  }
257
+ self.applyPreferredForwardBufferDuration()
242
258
  if self.isLooping {
243
259
  self.enqueueNextLoopItem()
244
260
  self.addPlaybackEndNotification()
@@ -437,6 +453,7 @@ public class AudioPlayer: SharedRef<AVPlayer>, Playable, LockScreenPlayable {
437
453
  }
438
454
  let nextItem = AVPlayerItem(asset: currentItem.asset)
439
455
  nextItem.audioTimePitchAlgorithm = currentItem.audioTimePitchAlgorithm
456
+ nextItem.preferredForwardBufferDuration = currentItem.preferredForwardBufferDuration
440
457
  queuePlayer.insert(nextItem, after: currentItem)
441
458
  }
442
459
 
@@ -0,0 +1 @@
1
+ 0f11527368066bf18f182fb39f3c1d69696aa59ddaec4b7ee16ec48183e25e23
@@ -0,0 +1 @@
1
+ ec4911e9008b292a0785c1496a40432c56b611dc2f19ecb0dc71020d4b439fed146d7bb18337a96bf6b77da28cb0fe71e6e8c7bd17b37649e554e4de43fb9d37
@@ -0,0 +1 @@
1
+ 148a8d932e5afc93e3a3cf4ea35d969d7f3329ac3127cc9da9fea428144321c9
@@ -0,0 +1 @@
1
+ 4251e28214a66fe78e625507dc58ff5a7f4547ce00a7ac7fd93171043547fd383168a0fff1936654259ebb916e4ac392770afd96be55a8ec7e7185fac49f7d2f
@@ -3,7 +3,7 @@
3
3
  "component": {
4
4
  "group": "expo.modules.audio",
5
5
  "module": "expo.modules.audio",
6
- "version": "58.0.7",
6
+ "version": "58.0.9",
7
7
  "attributes": {
8
8
  "org.gradle.status": "release"
9
9
  }
@@ -24,13 +24,13 @@
24
24
  },
25
25
  "files": [
26
26
  {
27
- "name": "expo.modules.audio-58.0.7.aar",
28
- "url": "expo.modules.audio-58.0.7.aar",
29
- "size": 560911,
30
- "sha512": "a5561246f985399aacbc1973743d782fdb42eade03470bee92eacfb77be5a67157f2b87e96f5004c16b65c146af341a9aa2ed90ca7b7129aca4224f161f0f98f",
31
- "sha256": "66ef223a729dc25795eb8a2ac81f772110be7331bcb8201858a53dce2d5be054",
32
- "sha1": "a67bfef57451d3cdbf9593b42736336fa342fec6",
33
- "md5": "8f4b5ebe1aaa3a88feb8d7e2d5ee1191"
27
+ "name": "expo.modules.audio-58.0.9.aar",
28
+ "url": "expo.modules.audio-58.0.9.aar",
29
+ "size": 562788,
30
+ "sha512": "4251e28214a66fe78e625507dc58ff5a7f4547ce00a7ac7fd93171043547fd383168a0fff1936654259ebb916e4ac392770afd96be55a8ec7e7185fac49f7d2f",
31
+ "sha256": "148a8d932e5afc93e3a3cf4ea35d969d7f3329ac3127cc9da9fea428144321c9",
32
+ "sha1": "bc24348a398e64ff880dc00571befaff11fcdd7c",
33
+ "md5": "9bd94c9bb03c7d84ae5536946035f450"
34
34
  }
35
35
  ]
36
36
  },
@@ -137,13 +137,13 @@
137
137
  ],
138
138
  "files": [
139
139
  {
140
- "name": "expo.modules.audio-58.0.7.aar",
141
- "url": "expo.modules.audio-58.0.7.aar",
142
- "size": 560911,
143
- "sha512": "a5561246f985399aacbc1973743d782fdb42eade03470bee92eacfb77be5a67157f2b87e96f5004c16b65c146af341a9aa2ed90ca7b7129aca4224f161f0f98f",
144
- "sha256": "66ef223a729dc25795eb8a2ac81f772110be7331bcb8201858a53dce2d5be054",
145
- "sha1": "a67bfef57451d3cdbf9593b42736336fa342fec6",
146
- "md5": "8f4b5ebe1aaa3a88feb8d7e2d5ee1191"
140
+ "name": "expo.modules.audio-58.0.9.aar",
141
+ "url": "expo.modules.audio-58.0.9.aar",
142
+ "size": 562788,
143
+ "sha512": "4251e28214a66fe78e625507dc58ff5a7f4547ce00a7ac7fd93171043547fd383168a0fff1936654259ebb916e4ac392770afd96be55a8ec7e7185fac49f7d2f",
144
+ "sha256": "148a8d932e5afc93e3a3cf4ea35d969d7f3329ac3127cc9da9fea428144321c9",
145
+ "sha1": "bc24348a398e64ff880dc00571befaff11fcdd7c",
146
+ "md5": "9bd94c9bb03c7d84ae5536946035f450"
147
147
  }
148
148
  ]
149
149
  },
@@ -157,13 +157,13 @@
157
157
  },
158
158
  "files": [
159
159
  {
160
- "name": "expo.modules.audio-58.0.7-sources.jar",
161
- "url": "expo.modules.audio-58.0.7-sources.jar",
162
- "size": 43154,
163
- "sha512": "e7dd160ec6dde30682c7e7001d944f703baa815825c685bc098757fa3f7a2a05db2aae5b95bb12eca2733d4d3867cd3b9321640e88683c2e0b0fc4f4855357c7",
164
- "sha256": "4a9c9fa744bae7346ceae6c312ed030bb16584e9d1e66473ebb84219a7ca3875",
165
- "sha1": "b025140d2c4d4afec6ff2177e5b11c3a65cf32b8",
166
- "md5": "83cf708677405e262c8c9b113888d179"
160
+ "name": "expo.modules.audio-58.0.9-sources.jar",
161
+ "url": "expo.modules.audio-58.0.9-sources.jar",
162
+ "size": 44166,
163
+ "sha512": "ec4911e9008b292a0785c1496a40432c56b611dc2f19ecb0dc71020d4b439fed146d7bb18337a96bf6b77da28cb0fe71e6e8c7bd17b37649e554e4de43fb9d37",
164
+ "sha256": "0f11527368066bf18f182fb39f3c1d69696aa59ddaec4b7ee16ec48183e25e23",
165
+ "sha1": "cbab8824e92895ba7865770ec62e4875325bd42a",
166
+ "md5": "a514205fbda56545f5396a0990b9f4f9"
167
167
  }
168
168
  ]
169
169
  }
@@ -0,0 +1 @@
1
+ fc5b401e0b74ce952248f6326f1886e58c5782af8ba4be045499ce3d6662a248
@@ -0,0 +1 @@
1
+ 0bf6874fcb8ebe25db4034cff6ff6f76dedfb0f0640dc04f825d50a321801a66598c09c5eb4b8daaa0a27bd64b2208e53ed19aa4632674de03d125b1ae50c6f1
@@ -9,7 +9,7 @@
9
9
  <modelVersion>4.0.0</modelVersion>
10
10
  <groupId>expo.modules.audio</groupId>
11
11
  <artifactId>expo.modules.audio</artifactId>
12
- <version>58.0.7</version>
12
+ <version>58.0.9</version>
13
13
  <packaging>aar</packaging>
14
14
  <name>expo.modules.audio</name>
15
15
  <url>https://github.com/expo/expo</url>
@@ -0,0 +1 @@
1
+ b7cd8f79f5f7e4914206b6912eeb50edd852a485299c7c3e430306db626ce63b
@@ -0,0 +1 @@
1
+ 641646b9c31bd16aa30a7bf6cac11ad642525e2812a41ca135edcfbddece5e8038816658ff8906941ef5e3343f87b870dd8774790484c339997f15558f6f4b5b
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-audio",
3
- "version": "58.0.7",
3
+ "version": "58.0.9",
4
4
  "description": "A cross-platform audio library for React Native and Expo apps.",
5
5
  "keywords": [
6
6
  "android",
@@ -22,12 +22,12 @@
22
22
  "main": "build/index.js",
23
23
  "types": "build/index.d.ts",
24
24
  "devDependencies": {
25
+ "@expo/internal-scripts": "58.0.1",
25
26
  "@types/jest": "^30.0.0",
26
27
  "@types/node": "^22.14.0",
27
28
  "@types/react": "~19.3.0",
28
- "expo": "58.0.6",
29
- "expo-asset": "58.0.13",
30
- "expo-module-scripts": "56.0.8"
29
+ "expo": "58.0.8",
30
+ "expo-asset": "58.0.14"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "expo": "*",
@@ -36,7 +36,7 @@
36
36
  "react-native": "*"
37
37
  },
38
38
  "jest": {
39
- "preset": "expo-module-scripts"
39
+ "preset": "@expo/internal-scripts"
40
40
  },
41
41
  "title": "Expo Audio",
42
42
  "scripts": {
@@ -1 +0,0 @@
1
- 4a9c9fa744bae7346ceae6c312ed030bb16584e9d1e66473ebb84219a7ca3875
@@ -1 +0,0 @@
1
- e7dd160ec6dde30682c7e7001d944f703baa815825c685bc098757fa3f7a2a05db2aae5b95bb12eca2733d4d3867cd3b9321640e88683c2e0b0fc4f4855357c7
@@ -1 +0,0 @@
1
- a67bfef57451d3cdbf9593b42736336fa342fec6
@@ -1 +0,0 @@
1
- 66ef223a729dc25795eb8a2ac81f772110be7331bcb8201858a53dce2d5be054
@@ -1 +0,0 @@
1
- a5561246f985399aacbc1973743d782fdb42eade03470bee92eacfb77be5a67157f2b87e96f5004c16b65c146af341a9aa2ed90ca7b7129aca4224f161f0f98f
@@ -1 +0,0 @@
1
- 0621362f20b3bea89af2b07edfbd14d3f6d77ab13800a2f00028ff5e84dff39d
@@ -1 +0,0 @@
1
- b0049cfdc64633e9af6f74a4ca794d549fee7033f855a186cc8562f9f9a695933e7a4a313134dbda6938ace9762625419bf73550f79a3cb6c350e3d68b7d5780
@@ -1 +0,0 @@
1
- 441a561e573f4d3fbec8deb1a5abd21610363fcc
@@ -1 +0,0 @@
1
- 7af59d9f87d98e504adfff67beb68736863cd686b4fde3e9d7bd83a0c7bfebe3
@@ -1 +0,0 @@
1
- 02b96337783f5352e386941375606159b8b4238e5278b2eed18d99018159c20b219038147936314888c08bce9357bd0a9787772632ee442e2199e51690a45c75