expo-audio 56.0.10 → 56.0.11

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 (41) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/android/build.gradle +2 -2
  3. package/build/AudioPlayer.web.d.ts.map +1 -1
  4. package/build/AudioPlayer.web.js +9 -0
  5. package/build/AudioPlayer.web.js.map +1 -1
  6. package/expo-module.config.json +1 -1
  7. package/local-maven-repo/expo/modules/audio/expo.modules.audio/{56.0.10/expo.modules.audio-56.0.10.module → 56.0.11/expo.modules.audio-56.0.11.module} +7 -7
  8. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.11/expo.modules.audio-56.0.11.module.md5 +1 -0
  9. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.11/expo.modules.audio-56.0.11.module.sha1 +1 -0
  10. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.11/expo.modules.audio-56.0.11.module.sha256 +1 -0
  11. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.11/expo.modules.audio-56.0.11.module.sha512 +1 -0
  12. package/local-maven-repo/expo/modules/audio/expo.modules.audio/{56.0.10/expo.modules.audio-56.0.10.pom → 56.0.11/expo.modules.audio-56.0.11.pom} +1 -1
  13. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.11/expo.modules.audio-56.0.11.pom.md5 +1 -0
  14. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.11/expo.modules.audio-56.0.11.pom.sha1 +1 -0
  15. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.11/expo.modules.audio-56.0.11.pom.sha256 +1 -0
  16. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.11/expo.modules.audio-56.0.11.pom.sha512 +1 -0
  17. package/local-maven-repo/expo/modules/audio/expo.modules.audio/maven-metadata.xml +4 -4
  18. package/local-maven-repo/expo/modules/audio/expo.modules.audio/maven-metadata.xml.md5 +1 -1
  19. package/local-maven-repo/expo/modules/audio/expo.modules.audio/maven-metadata.xml.sha1 +1 -1
  20. package/local-maven-repo/expo/modules/audio/expo.modules.audio/maven-metadata.xml.sha256 +1 -1
  21. package/local-maven-repo/expo/modules/audio/expo.modules.audio/maven-metadata.xml.sha512 +1 -1
  22. package/package.json +4 -4
  23. package/src/AudioPlayer.web.ts +12 -0
  24. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.10/expo.modules.audio-56.0.10.module.md5 +0 -1
  25. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.10/expo.modules.audio-56.0.10.module.sha1 +0 -1
  26. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.10/expo.modules.audio-56.0.10.module.sha256 +0 -1
  27. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.10/expo.modules.audio-56.0.10.module.sha512 +0 -1
  28. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.10/expo.modules.audio-56.0.10.pom.md5 +0 -1
  29. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.10/expo.modules.audio-56.0.10.pom.sha1 +0 -1
  30. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.10/expo.modules.audio-56.0.10.pom.sha256 +0 -1
  31. package/local-maven-repo/expo/modules/audio/expo.modules.audio/56.0.10/expo.modules.audio-56.0.10.pom.sha512 +0 -1
  32. /package/local-maven-repo/expo/modules/audio/expo.modules.audio/{56.0.10/expo.modules.audio-56.0.10-sources.jar → 56.0.11/expo.modules.audio-56.0.11-sources.jar} +0 -0
  33. /package/local-maven-repo/expo/modules/audio/expo.modules.audio/{56.0.10/expo.modules.audio-56.0.10-sources.jar.md5 → 56.0.11/expo.modules.audio-56.0.11-sources.jar.md5} +0 -0
  34. /package/local-maven-repo/expo/modules/audio/expo.modules.audio/{56.0.10/expo.modules.audio-56.0.10-sources.jar.sha1 → 56.0.11/expo.modules.audio-56.0.11-sources.jar.sha1} +0 -0
  35. /package/local-maven-repo/expo/modules/audio/expo.modules.audio/{56.0.10/expo.modules.audio-56.0.10-sources.jar.sha256 → 56.0.11/expo.modules.audio-56.0.11-sources.jar.sha256} +0 -0
  36. /package/local-maven-repo/expo/modules/audio/expo.modules.audio/{56.0.10/expo.modules.audio-56.0.10-sources.jar.sha512 → 56.0.11/expo.modules.audio-56.0.11-sources.jar.sha512} +0 -0
  37. /package/local-maven-repo/expo/modules/audio/expo.modules.audio/{56.0.10/expo.modules.audio-56.0.10.aar → 56.0.11/expo.modules.audio-56.0.11.aar} +0 -0
  38. /package/local-maven-repo/expo/modules/audio/expo.modules.audio/{56.0.10/expo.modules.audio-56.0.10.aar.md5 → 56.0.11/expo.modules.audio-56.0.11.aar.md5} +0 -0
  39. /package/local-maven-repo/expo/modules/audio/expo.modules.audio/{56.0.10/expo.modules.audio-56.0.10.aar.sha1 → 56.0.11/expo.modules.audio-56.0.11.aar.sha1} +0 -0
  40. /package/local-maven-repo/expo/modules/audio/expo.modules.audio/{56.0.10/expo.modules.audio-56.0.10.aar.sha256 → 56.0.11/expo.modules.audio-56.0.11.aar.sha256} +0 -0
  41. /package/local-maven-repo/expo/modules/audio/expo.modules.audio/{56.0.10/expo.modules.audio-56.0.10.aar.sha512 → 56.0.11/expo.modules.audio-56.0.11.aar.sha512} +0 -0
package/CHANGELOG.md CHANGED
@@ -10,6 +10,12 @@
10
10
 
11
11
  ### 💡 Others
12
12
 
13
+ ## 56.0.11 — 2026-05-26
14
+
15
+ ### 💡 Others
16
+
17
+ - [web] Added a warning when setting volume in browsers on iOS, where Apple does not allow programmatic volume control. ([#44474](https://github.com/expo/expo/pull/44474) by [@vonovak](https://github.com/vonovak))
18
+
13
19
  ## 56.0.10 — 2026-05-23
14
20
 
15
21
  ### 🐛 Bug fixes
@@ -4,13 +4,13 @@ plugins {
4
4
  }
5
5
 
6
6
  group = 'expo.modules.audio'
7
- version = '56.0.10'
7
+ version = '56.0.11'
8
8
 
9
9
  android {
10
10
  namespace "expo.modules.audio"
11
11
  defaultConfig {
12
12
  versionCode 1
13
- versionName "56.0.10"
13
+ versionName "56.0.11"
14
14
  }
15
15
 
16
16
  compileOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"AudioPlayer.web.d.ts","sourceRoot":"","sources":["../src/AudioPlayer.web.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,sBAAsB,EACvB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAYpE,eAAO,MAAM,aAAa,qBAA4B,CAAC;AAEvD,qBAAa,cACX,SAAQ,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAChD,YAAW,WAAW;gBAEV,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,kBAAuB;IAUjE,EAAE,EAAE,MAAM,CAAY;IACtB,wBAAwB,UAAS;IACjC,WAAW,UAAS;IACpB,kBAAkB,UAAS;IAE3B,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,QAAQ,CAAO;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAC,CAAkC;IACtD,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,cAAc,CAA0C;IAEhE,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,EAEvB;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAEtB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAE7B;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAEvB;IAED,IAAI,aAAa,IAAI,WAAW,CAE/B;IAED,IAAI,IAAI,IAAI;IASZ,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IA+B5B,MAAM,CACV,OAAO,EAAE,MAAM,EACf,qBAAqB,CAAC,EAAE,MAAM,EAC9B,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAAC,IAAI,CAAC;IAIhB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAqD/C,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,YAAY;IAOpB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,sBAAsB,CAAC,EAAE,sBAAsB,GAAG,IAAI;IAOtF,MAAM,IAAI,IAAI;IA6Bd,OAAO,IAAI,IAAI;IAIf,sBAAsB,CACpB,MAAM,EAAE,OAAO,EACf,QAAQ,CAAC,EAAE,aAAa,EACxB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,IAAI;IAQP,wBAAwB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAIvD,uBAAuB,IAAI,IAAI;IAI/B,cAAc,IAAI,OAAO;IAQzB,mBAAmB,IAAI,gBAAgB;CAqFxC"}
1
+ {"version":3,"file":"AudioPlayer.web.d.ts","sourceRoot":"","sources":["../src/AudioPlayer.web.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,sBAAsB,EACvB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAYpE,eAAO,MAAM,aAAa,qBAA4B,CAAC;AAOvD,qBAAa,cACX,SAAQ,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAChD,YAAW,WAAW;gBAEV,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,kBAAuB;IAUjE,EAAE,EAAE,MAAM,CAAY;IACtB,wBAAwB,UAAS;IACjC,WAAW,UAAS;IACpB,kBAAkB,UAAS;IAE3B,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,QAAQ,CAAO;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAC,CAAkC;IACtD,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,cAAc,CAA0C;IAEhE,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,EAEvB;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAEtB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAE7B;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EASvB;IAED,IAAI,aAAa,IAAI,WAAW,CAE/B;IAED,IAAI,IAAI,IAAI;IASZ,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IA+B5B,MAAM,CACV,OAAO,EAAE,MAAM,EACf,qBAAqB,CAAC,EAAE,MAAM,EAC9B,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAAC,IAAI,CAAC;IAIhB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAqD/C,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,YAAY;IAOpB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,sBAAsB,CAAC,EAAE,sBAAsB,GAAG,IAAI;IAOtF,MAAM,IAAI,IAAI;IA6Bd,OAAO,IAAI,IAAI;IAIf,sBAAsB,CACpB,MAAM,EAAE,OAAO,EACf,QAAQ,CAAC,EAAE,aAAa,EACxB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,IAAI;IAQP,wBAAwB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAIvD,uBAAuB,IAAI,IAAI;IAI/B,cAAc,IAAI,OAAO;IAQzB,mBAAmB,IAAI,gBAAgB;CAqFxC"}
@@ -3,6 +3,10 @@ import { isAudioActive } from './AudioModule.web';
3
3
  import { getAudioContext, getSourceUri, getStatusFromMedia, nextId, preloadCache, safeDuration, } from './AudioUtils.web';
4
4
  import { mediaSessionController } from './MediaSessionController.web';
5
5
  export const activePlayers = new Set();
6
+ let hasWarnedIOSVolume = false;
7
+ function isIOSSafari() {
8
+ return /iPad|iPhone|iPod/.test(navigator.userAgent);
9
+ }
6
10
  export class AudioPlayerWeb extends globalThis.expo.SharedObject {
7
11
  constructor(source, options = {}) {
8
12
  super();
@@ -65,6 +69,11 @@ export class AudioPlayerWeb extends globalThis.expo.SharedObject {
65
69
  return this.media.volume;
66
70
  }
67
71
  set volume(value) {
72
+ if (!hasWarnedIOSVolume && isIOSSafari()) {
73
+ hasWarnedIOSVolume = true;
74
+ console.warn('expo-audio: Programmatic volume control is not supported in browsers on iOS. ' +
75
+ 'Apple requires volume to be controlled exclusively by the device physical buttons.');
76
+ }
68
77
  this.media.volume = value;
69
78
  }
70
79
  get currentStatus() {
@@ -1 +1 @@
1
- {"version":3,"file":"AudioPlayer.web.js","sourceRoot":"","sources":["../src/AudioPlayer.web.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AudioMetadata,\n AudioPlayerOptions,\n AudioSource,\n AudioStatus,\n PitchCorrectionQuality,\n} from './Audio.types';\nimport type { AudioLockScreenOptions } from './AudioConstants';\nimport { AUDIO_SAMPLE_UPDATE, PLAYBACK_STATUS_UPDATE } from './AudioEventKeys';\nimport type { AudioPlayer, AudioEvents } from './AudioModule.types';\nimport { isAudioActive } from './AudioModule.web';\nimport {\n getAudioContext,\n getSourceUri,\n getStatusFromMedia,\n nextId,\n preloadCache,\n safeDuration,\n} from './AudioUtils.web';\nimport { mediaSessionController } from './MediaSessionController.web';\n\nexport const activePlayers = new Set<AudioPlayerWeb>();\n\nexport class AudioPlayerWeb\n extends globalThis.expo.SharedObject<AudioEvents>\n implements AudioPlayer\n{\n constructor(source: AudioSource, options: AudioPlayerOptions = {}) {\n super();\n const { updateInterval = 500, crossOrigin } = options;\n this.src = source;\n this.interval = Math.max(updateInterval, 1);\n this.crossOrigin = crossOrigin;\n this.media = this._createMediaElement();\n activePlayers.add(this);\n }\n\n id: string = nextId();\n isAudioSamplingSupported = false;\n isBuffering = false;\n shouldCorrectPitch = false;\n\n private src: AudioSource = null;\n private media: HTMLAudioElement;\n private interval = 500;\n private isPlaying = false;\n private loaded = false;\n private crossOrigin?: 'anonymous' | 'use-credentials';\n private analyser: AnalyserNode | null = null;\n private sourceNode: MediaElementAudioSourceNode | null = null;\n private samplingFrameId: number | null = null;\n private samplingEnabled = false;\n private samplingBuffer: Float32Array<ArrayBuffer> | null = null;\n\n get playing(): boolean {\n return this.isPlaying;\n }\n\n get muted(): boolean {\n return this.media.muted;\n }\n\n set muted(value: boolean) {\n this.media.muted = value;\n }\n\n get loop(): boolean {\n return this.media.loop;\n }\n\n set loop(value: boolean) {\n this.media.loop = value;\n }\n\n get duration(): number {\n return safeDuration(this.media.duration);\n }\n\n get currentTime(): number {\n return this.media.currentTime;\n }\n\n get paused(): boolean {\n return this.media.paused;\n }\n\n get isLoaded(): boolean {\n return this.loaded;\n }\n\n get playbackRate(): number {\n return this.media.playbackRate;\n }\n\n set playbackRate(value: number) {\n this.media.playbackRate = value;\n }\n\n get volume(): number {\n return this.media.volume;\n }\n\n set volume(value: number) {\n this.media.volume = value;\n }\n\n get currentStatus(): AudioStatus {\n return getStatusFromMedia(this.media, this.id);\n }\n\n play(): void {\n if (!isAudioActive) {\n return;\n }\n this.media.play();\n this.isPlaying = true;\n this.startSampling();\n }\n\n pause(): void {\n this.media.pause();\n this.isPlaying = false;\n this.stopSampling();\n }\n\n replace(source: AudioSource): void {\n const wasPlaying = this.isPlaying;\n const wasSampling = this.samplingEnabled;\n const mediaSessionState = mediaSessionController.getActiveState(this);\n\n // we need to remove the current media element and create a new one\n this.remove();\n\n this.src = source;\n this.isPlaying = false;\n this.loaded = false;\n this.media = this._createMediaElement();\n\n if (wasSampling) {\n this.setAudioSamplingEnabled(true);\n }\n\n if (mediaSessionState) {\n mediaSessionController.setActivePlayer(\n this,\n mediaSessionState.metadata ?? undefined,\n mediaSessionState.options ?? undefined\n );\n }\n\n // Resume playback if it was playing before\n if (wasPlaying) {\n this.play();\n }\n }\n\n async seekTo(\n seconds: number,\n toleranceMillisBefore?: number,\n toleranceMillisAfter?: number\n ): Promise<void> {\n this.media.currentTime = seconds;\n }\n\n setAudioSamplingEnabled(enabled: boolean): void {\n if (enabled) {\n if (!this.media.crossOrigin && this._isCrossOrigin()) {\n this.isAudioSamplingSupported = false;\n return;\n }\n\n if (this.analyser) {\n return;\n }\n\n const ctx = getAudioContext();\n if (ctx.state === 'suspended') {\n ctx.resume();\n }\n\n if (!this.sourceNode) {\n this.sourceNode = ctx.createMediaElementSource(this.media);\n }\n\n this.analyser = ctx.createAnalyser();\n this.analyser.fftSize = 2048;\n\n this.sourceNode.disconnect();\n this.sourceNode.connect(this.analyser);\n this.analyser.connect(ctx.destination);\n\n this.samplingBuffer = new Float32Array(this.analyser.frequencyBinCount);\n this.samplingEnabled = true;\n\n if (this.isPlaying) {\n this.startSampling();\n }\n this.isAudioSamplingSupported = true;\n } else {\n this.stopSampling();\n\n if (this.analyser) {\n this.analyser.disconnect();\n this.analyser = null;\n }\n\n if (this.sourceNode) {\n const ctx = getAudioContext();\n this.sourceNode.disconnect();\n this.sourceNode.connect(ctx.destination);\n }\n\n this.samplingBuffer = null;\n this.samplingEnabled = false;\n }\n }\n\n private startSampling(): void {\n if (!this.samplingEnabled || !this.analyser || !this.samplingBuffer) {\n return;\n }\n const sampleLoop = () => {\n if (!this.analyser || !this.samplingBuffer) {\n return;\n }\n this.analyser.getFloatTimeDomainData(this.samplingBuffer);\n this.emit(AUDIO_SAMPLE_UPDATE, {\n channels: [{ frames: Array.from(this.samplingBuffer) }],\n timestamp: this.media.currentTime,\n });\n this.samplingFrameId = requestAnimationFrame(sampleLoop);\n };\n this.samplingFrameId = requestAnimationFrame(sampleLoop);\n }\n\n private stopSampling(): void {\n if (this.samplingFrameId != null) {\n cancelAnimationFrame(this.samplingFrameId);\n this.samplingFrameId = null;\n }\n }\n\n setPlaybackRate(second: number, pitchCorrectionQuality?: PitchCorrectionQuality): void {\n this.media.playbackRate = second;\n this.shouldCorrectPitch = pitchCorrectionQuality === 'high';\n this.media.preservesPitch = this.shouldCorrectPitch;\n mediaSessionController.updatePositionState(this);\n }\n\n remove(): void {\n mediaSessionController.clear(this);\n this.stopSampling();\n\n if (this.analyser) {\n this.analyser.disconnect();\n this.analyser = null;\n }\n\n if (this.sourceNode) {\n this.sourceNode.disconnect();\n this.sourceNode = null;\n }\n\n this.samplingEnabled = false;\n this.media.pause();\n // Clear event handlers to prevent memory leaks\n this.media.ontimeupdate = null;\n this.media.onplay = null;\n this.media.onpause = null;\n this.media.onseeked = null;\n this.media.onended = null;\n this.media.onloadeddata = null;\n this.media.onerror = null;\n this.media.removeAttribute('src');\n this.media.load();\n activePlayers.delete(this);\n }\n\n release(): void {\n this.remove();\n }\n\n setActiveForLockScreen(\n active: boolean,\n metadata?: AudioMetadata,\n options?: AudioLockScreenOptions\n ): void {\n if (active) {\n mediaSessionController.setActivePlayer(this, metadata, options);\n } else {\n mediaSessionController.clear(this);\n }\n }\n\n updateLockScreenMetadata(metadata: AudioMetadata): void {\n mediaSessionController.updateMetadata(this, metadata);\n }\n\n clearLockScreenControls(): void {\n mediaSessionController.clear(this);\n }\n\n _isCrossOrigin(): boolean {\n try {\n return new URL(this.media.src).origin !== window.location.origin;\n } catch {\n return false;\n }\n }\n\n _createMediaElement(): HTMLAudioElement {\n const newSource = getSourceUri(this.src);\n const cachedUri =\n newSource && preloadCache.has(newSource) ? preloadCache.get(newSource)!.blobUrl : newSource;\n const media = new Audio(cachedUri);\n if (this.crossOrigin !== undefined) {\n media.crossOrigin = this.crossOrigin;\n }\n\n let lastEmitTime = 0;\n const intervalSec = this.interval / 1000;\n\n // Throttled status updates based on interval\n media.ontimeupdate = () => {\n const now = media.currentTime;\n // Handle backwards time (loop/seek)\n if (now < lastEmitTime) {\n lastEmitTime = now;\n }\n if (now - lastEmitTime >= intervalSec) {\n lastEmitTime = now;\n this.emit(PLAYBACK_STATUS_UPDATE, getStatusFromMedia(media, this.id));\n mediaSessionController.updatePositionState(this);\n }\n };\n\n media.onplay = () => {\n this.isPlaying = true;\n lastEmitTime = media.currentTime;\n this.emit(PLAYBACK_STATUS_UPDATE, {\n ...getStatusFromMedia(media, this.id),\n playing: this.isPlaying,\n });\n mediaSessionController.updatePlaybackState(this);\n mediaSessionController.updatePositionState(this);\n };\n\n media.onpause = () => {\n this.isPlaying = false;\n lastEmitTime = media.currentTime;\n this.emit(PLAYBACK_STATUS_UPDATE, {\n ...getStatusFromMedia(media, this.id),\n playing: this.isPlaying,\n });\n mediaSessionController.updatePlaybackState(this);\n mediaSessionController.updatePositionState(this);\n };\n\n media.onseeked = () => {\n lastEmitTime = media.currentTime;\n this.emit(PLAYBACK_STATUS_UPDATE, getStatusFromMedia(media, this.id));\n mediaSessionController.updatePositionState(this);\n };\n\n media.onended = () => {\n lastEmitTime = 0;\n mediaSessionController.updatePlaybackState(this);\n };\n\n media.onloadeddata = () => {\n this.loaded = true;\n lastEmitTime = media.currentTime;\n this.emit(PLAYBACK_STATUS_UPDATE, {\n ...getStatusFromMedia(media, this.id),\n isLoaded: this.loaded,\n });\n mediaSessionController.updatePositionState(this);\n };\n\n media.onerror = () => {\n this.loaded = false;\n this.isPlaying = false;\n const errorMessage = media.error\n ? `Playback error (code ${media.error.code})`\n : 'Unknown playback error';\n this.emit(PLAYBACK_STATUS_UPDATE, {\n ...getStatusFromMedia(media, this.id),\n isLoaded: false,\n playing: false,\n error: errorMessage,\n });\n };\n\n return media;\n }\n}\n"]}
1
+ {"version":3,"file":"AudioPlayer.web.js","sourceRoot":"","sources":["../src/AudioPlayer.web.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AudioMetadata,\n AudioPlayerOptions,\n AudioSource,\n AudioStatus,\n PitchCorrectionQuality,\n} from './Audio.types';\nimport type { AudioLockScreenOptions } from './AudioConstants';\nimport { AUDIO_SAMPLE_UPDATE, PLAYBACK_STATUS_UPDATE } from './AudioEventKeys';\nimport type { AudioPlayer, AudioEvents } from './AudioModule.types';\nimport { isAudioActive } from './AudioModule.web';\nimport {\n getAudioContext,\n getSourceUri,\n getStatusFromMedia,\n nextId,\n preloadCache,\n safeDuration,\n} from './AudioUtils.web';\nimport { mediaSessionController } from './MediaSessionController.web';\n\nexport const activePlayers = new Set<AudioPlayerWeb>();\n\nlet hasWarnedIOSVolume = false;\nfunction isIOSSafari(): boolean {\n return /iPad|iPhone|iPod/.test(navigator.userAgent);\n}\n\nexport class AudioPlayerWeb\n extends globalThis.expo.SharedObject<AudioEvents>\n implements AudioPlayer\n{\n constructor(source: AudioSource, options: AudioPlayerOptions = {}) {\n super();\n const { updateInterval = 500, crossOrigin } = options;\n this.src = source;\n this.interval = Math.max(updateInterval, 1);\n this.crossOrigin = crossOrigin;\n this.media = this._createMediaElement();\n activePlayers.add(this);\n }\n\n id: string = nextId();\n isAudioSamplingSupported = false;\n isBuffering = false;\n shouldCorrectPitch = false;\n\n private src: AudioSource = null;\n private media: HTMLAudioElement;\n private interval = 500;\n private isPlaying = false;\n private loaded = false;\n private crossOrigin?: 'anonymous' | 'use-credentials';\n private analyser: AnalyserNode | null = null;\n private sourceNode: MediaElementAudioSourceNode | null = null;\n private samplingFrameId: number | null = null;\n private samplingEnabled = false;\n private samplingBuffer: Float32Array<ArrayBuffer> | null = null;\n\n get playing(): boolean {\n return this.isPlaying;\n }\n\n get muted(): boolean {\n return this.media.muted;\n }\n\n set muted(value: boolean) {\n this.media.muted = value;\n }\n\n get loop(): boolean {\n return this.media.loop;\n }\n\n set loop(value: boolean) {\n this.media.loop = value;\n }\n\n get duration(): number {\n return safeDuration(this.media.duration);\n }\n\n get currentTime(): number {\n return this.media.currentTime;\n }\n\n get paused(): boolean {\n return this.media.paused;\n }\n\n get isLoaded(): boolean {\n return this.loaded;\n }\n\n get playbackRate(): number {\n return this.media.playbackRate;\n }\n\n set playbackRate(value: number) {\n this.media.playbackRate = value;\n }\n\n get volume(): number {\n return this.media.volume;\n }\n\n set volume(value: number) {\n if (!hasWarnedIOSVolume && isIOSSafari()) {\n hasWarnedIOSVolume = true;\n console.warn(\n 'expo-audio: Programmatic volume control is not supported in browsers on iOS. ' +\n 'Apple requires volume to be controlled exclusively by the device physical buttons.'\n );\n }\n this.media.volume = value;\n }\n\n get currentStatus(): AudioStatus {\n return getStatusFromMedia(this.media, this.id);\n }\n\n play(): void {\n if (!isAudioActive) {\n return;\n }\n this.media.play();\n this.isPlaying = true;\n this.startSampling();\n }\n\n pause(): void {\n this.media.pause();\n this.isPlaying = false;\n this.stopSampling();\n }\n\n replace(source: AudioSource): void {\n const wasPlaying = this.isPlaying;\n const wasSampling = this.samplingEnabled;\n const mediaSessionState = mediaSessionController.getActiveState(this);\n\n // we need to remove the current media element and create a new one\n this.remove();\n\n this.src = source;\n this.isPlaying = false;\n this.loaded = false;\n this.media = this._createMediaElement();\n\n if (wasSampling) {\n this.setAudioSamplingEnabled(true);\n }\n\n if (mediaSessionState) {\n mediaSessionController.setActivePlayer(\n this,\n mediaSessionState.metadata ?? undefined,\n mediaSessionState.options ?? undefined\n );\n }\n\n // Resume playback if it was playing before\n if (wasPlaying) {\n this.play();\n }\n }\n\n async seekTo(\n seconds: number,\n toleranceMillisBefore?: number,\n toleranceMillisAfter?: number\n ): Promise<void> {\n this.media.currentTime = seconds;\n }\n\n setAudioSamplingEnabled(enabled: boolean): void {\n if (enabled) {\n if (!this.media.crossOrigin && this._isCrossOrigin()) {\n this.isAudioSamplingSupported = false;\n return;\n }\n\n if (this.analyser) {\n return;\n }\n\n const ctx = getAudioContext();\n if (ctx.state === 'suspended') {\n ctx.resume();\n }\n\n if (!this.sourceNode) {\n this.sourceNode = ctx.createMediaElementSource(this.media);\n }\n\n this.analyser = ctx.createAnalyser();\n this.analyser.fftSize = 2048;\n\n this.sourceNode.disconnect();\n this.sourceNode.connect(this.analyser);\n this.analyser.connect(ctx.destination);\n\n this.samplingBuffer = new Float32Array(this.analyser.frequencyBinCount);\n this.samplingEnabled = true;\n\n if (this.isPlaying) {\n this.startSampling();\n }\n this.isAudioSamplingSupported = true;\n } else {\n this.stopSampling();\n\n if (this.analyser) {\n this.analyser.disconnect();\n this.analyser = null;\n }\n\n if (this.sourceNode) {\n const ctx = getAudioContext();\n this.sourceNode.disconnect();\n this.sourceNode.connect(ctx.destination);\n }\n\n this.samplingBuffer = null;\n this.samplingEnabled = false;\n }\n }\n\n private startSampling(): void {\n if (!this.samplingEnabled || !this.analyser || !this.samplingBuffer) {\n return;\n }\n const sampleLoop = () => {\n if (!this.analyser || !this.samplingBuffer) {\n return;\n }\n this.analyser.getFloatTimeDomainData(this.samplingBuffer);\n this.emit(AUDIO_SAMPLE_UPDATE, {\n channels: [{ frames: Array.from(this.samplingBuffer) }],\n timestamp: this.media.currentTime,\n });\n this.samplingFrameId = requestAnimationFrame(sampleLoop);\n };\n this.samplingFrameId = requestAnimationFrame(sampleLoop);\n }\n\n private stopSampling(): void {\n if (this.samplingFrameId != null) {\n cancelAnimationFrame(this.samplingFrameId);\n this.samplingFrameId = null;\n }\n }\n\n setPlaybackRate(second: number, pitchCorrectionQuality?: PitchCorrectionQuality): void {\n this.media.playbackRate = second;\n this.shouldCorrectPitch = pitchCorrectionQuality === 'high';\n this.media.preservesPitch = this.shouldCorrectPitch;\n mediaSessionController.updatePositionState(this);\n }\n\n remove(): void {\n mediaSessionController.clear(this);\n this.stopSampling();\n\n if (this.analyser) {\n this.analyser.disconnect();\n this.analyser = null;\n }\n\n if (this.sourceNode) {\n this.sourceNode.disconnect();\n this.sourceNode = null;\n }\n\n this.samplingEnabled = false;\n this.media.pause();\n // Clear event handlers to prevent memory leaks\n this.media.ontimeupdate = null;\n this.media.onplay = null;\n this.media.onpause = null;\n this.media.onseeked = null;\n this.media.onended = null;\n this.media.onloadeddata = null;\n this.media.onerror = null;\n this.media.removeAttribute('src');\n this.media.load();\n activePlayers.delete(this);\n }\n\n release(): void {\n this.remove();\n }\n\n setActiveForLockScreen(\n active: boolean,\n metadata?: AudioMetadata,\n options?: AudioLockScreenOptions\n ): void {\n if (active) {\n mediaSessionController.setActivePlayer(this, metadata, options);\n } else {\n mediaSessionController.clear(this);\n }\n }\n\n updateLockScreenMetadata(metadata: AudioMetadata): void {\n mediaSessionController.updateMetadata(this, metadata);\n }\n\n clearLockScreenControls(): void {\n mediaSessionController.clear(this);\n }\n\n _isCrossOrigin(): boolean {\n try {\n return new URL(this.media.src).origin !== window.location.origin;\n } catch {\n return false;\n }\n }\n\n _createMediaElement(): HTMLAudioElement {\n const newSource = getSourceUri(this.src);\n const cachedUri =\n newSource && preloadCache.has(newSource) ? preloadCache.get(newSource)!.blobUrl : newSource;\n const media = new Audio(cachedUri);\n if (this.crossOrigin !== undefined) {\n media.crossOrigin = this.crossOrigin;\n }\n\n let lastEmitTime = 0;\n const intervalSec = this.interval / 1000;\n\n // Throttled status updates based on interval\n media.ontimeupdate = () => {\n const now = media.currentTime;\n // Handle backwards time (loop/seek)\n if (now < lastEmitTime) {\n lastEmitTime = now;\n }\n if (now - lastEmitTime >= intervalSec) {\n lastEmitTime = now;\n this.emit(PLAYBACK_STATUS_UPDATE, getStatusFromMedia(media, this.id));\n mediaSessionController.updatePositionState(this);\n }\n };\n\n media.onplay = () => {\n this.isPlaying = true;\n lastEmitTime = media.currentTime;\n this.emit(PLAYBACK_STATUS_UPDATE, {\n ...getStatusFromMedia(media, this.id),\n playing: this.isPlaying,\n });\n mediaSessionController.updatePlaybackState(this);\n mediaSessionController.updatePositionState(this);\n };\n\n media.onpause = () => {\n this.isPlaying = false;\n lastEmitTime = media.currentTime;\n this.emit(PLAYBACK_STATUS_UPDATE, {\n ...getStatusFromMedia(media, this.id),\n playing: this.isPlaying,\n });\n mediaSessionController.updatePlaybackState(this);\n mediaSessionController.updatePositionState(this);\n };\n\n media.onseeked = () => {\n lastEmitTime = media.currentTime;\n this.emit(PLAYBACK_STATUS_UPDATE, getStatusFromMedia(media, this.id));\n mediaSessionController.updatePositionState(this);\n };\n\n media.onended = () => {\n lastEmitTime = 0;\n mediaSessionController.updatePlaybackState(this);\n };\n\n media.onloadeddata = () => {\n this.loaded = true;\n lastEmitTime = media.currentTime;\n this.emit(PLAYBACK_STATUS_UPDATE, {\n ...getStatusFromMedia(media, this.id),\n isLoaded: this.loaded,\n });\n mediaSessionController.updatePositionState(this);\n };\n\n media.onerror = () => {\n this.loaded = false;\n this.isPlaying = false;\n const errorMessage = media.error\n ? `Playback error (code ${media.error.code})`\n : 'Unknown playback error';\n this.emit(PLAYBACK_STATUS_UPDATE, {\n ...getStatusFromMedia(media, this.id),\n isLoaded: false,\n playing: false,\n error: errorMessage,\n });\n };\n\n return media;\n }\n}\n"]}
@@ -8,7 +8,7 @@
8
8
  "publication": {
9
9
  "groupId": "expo.modules.audio",
10
10
  "artifactId": "expo.modules.audio",
11
- "version": "56.0.10",
11
+ "version": "56.0.11",
12
12
  "repository": "local-maven-repo"
13
13
  }
14
14
  }
@@ -3,7 +3,7 @@
3
3
  "component": {
4
4
  "group": "expo.modules.audio",
5
5
  "module": "expo.modules.audio",
6
- "version": "56.0.10",
6
+ "version": "56.0.11",
7
7
  "attributes": {
8
8
  "org.gradle.status": "release"
9
9
  }
@@ -24,8 +24,8 @@
24
24
  },
25
25
  "files": [
26
26
  {
27
- "name": "expo.modules.audio-56.0.10.aar",
28
- "url": "expo.modules.audio-56.0.10.aar",
27
+ "name": "expo.modules.audio-56.0.11.aar",
28
+ "url": "expo.modules.audio-56.0.11.aar",
29
29
  "size": 480356,
30
30
  "sha512": "95d64e6a85ee173036705bd0e8f1a6f105c7aeef2c8580baac56e02e036eadacfe957483e73714e4978caba65b436db9ee2ccfae37e92ec9b6a63a137eba9089",
31
31
  "sha256": "95533b89371520ec746e42c6b52e3cd84901887892406557543b627d15254675",
@@ -137,8 +137,8 @@
137
137
  ],
138
138
  "files": [
139
139
  {
140
- "name": "expo.modules.audio-56.0.10.aar",
141
- "url": "expo.modules.audio-56.0.10.aar",
140
+ "name": "expo.modules.audio-56.0.11.aar",
141
+ "url": "expo.modules.audio-56.0.11.aar",
142
142
  "size": 480356,
143
143
  "sha512": "95d64e6a85ee173036705bd0e8f1a6f105c7aeef2c8580baac56e02e036eadacfe957483e73714e4978caba65b436db9ee2ccfae37e92ec9b6a63a137eba9089",
144
144
  "sha256": "95533b89371520ec746e42c6b52e3cd84901887892406557543b627d15254675",
@@ -157,8 +157,8 @@
157
157
  },
158
158
  "files": [
159
159
  {
160
- "name": "expo.modules.audio-56.0.10-sources.jar",
161
- "url": "expo.modules.audio-56.0.10-sources.jar",
160
+ "name": "expo.modules.audio-56.0.11-sources.jar",
161
+ "url": "expo.modules.audio-56.0.11-sources.jar",
162
162
  "size": 37155,
163
163
  "sha512": "2cef82741c5f4562bc1a2c9b16d41cd69107bf833476f95e1820363ee18148611fc0cb4a629fde4c207f94d7ecc0469f6cee065384c279d0febc77edb0bb5e8c",
164
164
  "sha256": "6e0e5d67021e82a9f914123cb4f0faf84f7d41e2a5ed5e52418b75db55eb7828",
@@ -0,0 +1 @@
1
+ fb3d5f5ba7af9506b172e339a5147a49f3b8c2ef8a714355a80f4f179f3e1fa7
@@ -0,0 +1 @@
1
+ 5aff72852194d6f40392700bdda38cab52d40ce14e0ef04b692b0220379f2def6547ba61483ddc31a397d98404d2049ba5cd69fe9701dc185c91cd8e058ec0c0
@@ -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>56.0.10</version>
12
+ <version>56.0.11</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
+ f97b2aed4cd6e939eb78137a965e5df2e99fc3b70ce3f8ab171a366befbce5c6
@@ -0,0 +1 @@
1
+ 90b2e611016a10d781658d54a8611ad58d00f49c7de3d0fb15e54fc9a7b5736b55a983caafb1cd92bbef8ed806923753c8fb62ce44daaaee57fd95c3986d0556
@@ -3,11 +3,11 @@
3
3
  <groupId>expo.modules.audio</groupId>
4
4
  <artifactId>expo.modules.audio</artifactId>
5
5
  <versioning>
6
- <latest>56.0.10</latest>
7
- <release>56.0.10</release>
6
+ <latest>56.0.11</latest>
7
+ <release>56.0.11</release>
8
8
  <versions>
9
- <version>56.0.10</version>
9
+ <version>56.0.11</version>
10
10
  </versions>
11
- <lastUpdated>20260523133908</lastUpdated>
11
+ <lastUpdated>20260526084446</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 8420dc49d46a115bda1702d83be531aa
1
+ 781e2f3510c34ae5be75a7853ce960ef
@@ -1 +1 @@
1
- 64e480ad82f99c62b93659df5cee7243c9651090
1
+ 77856d60901b7daaeb493c4fa6d738f836028fff
@@ -1 +1 @@
1
- 9d241bf2a91a35af2b1e725afe26be35685a96b96c1ad6cfe372d66eec0dc23a
1
+ a351dbb79909a5ca3ca038b97b64568dc965159b5ce7cd55c224879861cc020f
@@ -1 +1 @@
1
- e785474688e529c4ccb83dc70061e542f334362dc5b6755ff7209e34df46e4db64a6394277f07dee139d14eb4ce9d3cc528e667b3417ea1e8ae8caf1c9e82c73
1
+ fcca792f4c8fc50c741ccd3d9af22474300a30ebbb8a39997bbb3325b738176da97ffed109eac67b99a8214eed9dc8aeb144253a8b8ba2c21a86efe999da08ee
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "expo-audio",
3
3
  "title": "Expo Audio",
4
- "version": "56.0.10",
4
+ "version": "56.0.11",
5
5
  "description": "A cross-platform audio library for React Native and Expo apps.",
6
6
  "main": "build/index.js",
7
7
  "types": "build/index.d.ts",
@@ -26,9 +26,9 @@
26
26
  "devDependencies": {
27
27
  "@types/react": "~19.2.0",
28
28
  "@types/node": "^22.14.0",
29
+ "expo": "56.0.5",
29
30
  "expo-module-scripts": "56.0.2",
30
- "expo": "56.0.4",
31
- "expo-asset": "56.0.14"
31
+ "expo-asset": "56.0.15"
32
32
  },
33
33
  "peerDependencies": {
34
34
  "expo": "*",
@@ -36,7 +36,7 @@
36
36
  "react-native": "*",
37
37
  "expo-asset": "*"
38
38
  },
39
- "gitHead": "6dfb0e4c958a1ea1d66d3f7952494ac58430ad45",
39
+ "gitHead": "f67a101bcbe56114e982184834b93da7bbed00af",
40
40
  "scripts": {
41
41
  "build": "expo-module build",
42
42
  "clean": "expo-module clean",
@@ -21,6 +21,11 @@ import { mediaSessionController } from './MediaSessionController.web';
21
21
 
22
22
  export const activePlayers = new Set<AudioPlayerWeb>();
23
23
 
24
+ let hasWarnedIOSVolume = false;
25
+ function isIOSSafari(): boolean {
26
+ return /iPad|iPhone|iPod/.test(navigator.userAgent);
27
+ }
28
+
24
29
  export class AudioPlayerWeb
25
30
  extends globalThis.expo.SharedObject<AudioEvents>
26
31
  implements AudioPlayer
@@ -101,6 +106,13 @@ export class AudioPlayerWeb
101
106
  }
102
107
 
103
108
  set volume(value: number) {
109
+ if (!hasWarnedIOSVolume && isIOSSafari()) {
110
+ hasWarnedIOSVolume = true;
111
+ console.warn(
112
+ 'expo-audio: Programmatic volume control is not supported in browsers on iOS. ' +
113
+ 'Apple requires volume to be controlled exclusively by the device physical buttons.'
114
+ );
115
+ }
104
116
  this.media.volume = value;
105
117
  }
106
118
 
@@ -1 +0,0 @@
1
- b166282c651cc78fb82fe87c7417726fa988568d7594511c5fd1d2c674b76e5a
@@ -1 +0,0 @@
1
- e8d5cb8731cfad50931166a081a68f8977d147a910131b0fd843082d4f1c4f72a75714709ff317e4727b81e346ca645c7e743b4bdc8f945a23939265d77e7eee
@@ -1 +0,0 @@
1
- 390824305731a345b9bae0aae7fe9a20af18e98d
@@ -1 +0,0 @@
1
- ae774e0fca70c8a79b11e45d6c141b4ff5122b5843202c9a7638dfd80ef911c0
@@ -1 +0,0 @@
1
- 7cdee55840ec4f64cb7791a5681133bd50028d4bdb052eb8006b999a0f3656908484d083d24905fdcb68b1b1ca40f41c9082113ccf907674dea527695d31a11c