@capgo/capacitor-native-audio 8.4.3

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 (46) hide show
  1. package/CapgoCapacitorNativeAudio.podspec +16 -0
  2. package/LICENSE +373 -0
  3. package/Package.swift +31 -0
  4. package/README.md +1229 -0
  5. package/android/build.gradle +89 -0
  6. package/android/src/main/AndroidManifest.xml +3 -0
  7. package/android/src/main/java/ee/forgr/audio/AudioAsset.java +611 -0
  8. package/android/src/main/java/ee/forgr/audio/AudioCompletionListener.java +5 -0
  9. package/android/src/main/java/ee/forgr/audio/AudioDispatcher.java +208 -0
  10. package/android/src/main/java/ee/forgr/audio/Constant.java +36 -0
  11. package/android/src/main/java/ee/forgr/audio/HlsAvailabilityChecker.java +84 -0
  12. package/android/src/main/java/ee/forgr/audio/Logger.java +55 -0
  13. package/android/src/main/java/ee/forgr/audio/NativeAudio.java +2022 -0
  14. package/android/src/main/java/ee/forgr/audio/RemoteAudioAsset.java +886 -0
  15. package/android/src/main/java/ee/forgr/audio/StreamAudioAsset.java +708 -0
  16. package/android/src/main/res/values/colors.xml +3 -0
  17. package/android/src/main/res/values/strings.xml +3 -0
  18. package/android/src/main/res/values/styles.xml +3 -0
  19. package/dist/docs.json +1470 -0
  20. package/dist/esm/audio-asset.d.ts +4 -0
  21. package/dist/esm/audio-asset.js +6 -0
  22. package/dist/esm/audio-asset.js.map +1 -0
  23. package/dist/esm/definitions.d.ts +597 -0
  24. package/dist/esm/definitions.js +2 -0
  25. package/dist/esm/definitions.js.map +1 -0
  26. package/dist/esm/index.d.ts +4 -0
  27. package/dist/esm/index.js +7 -0
  28. package/dist/esm/index.js.map +1 -0
  29. package/dist/esm/web.d.ts +82 -0
  30. package/dist/esm/web.js +553 -0
  31. package/dist/esm/web.js.map +1 -0
  32. package/dist/plugin.cjs.js +571 -0
  33. package/dist/plugin.cjs.js.map +1 -0
  34. package/dist/plugin.js +574 -0
  35. package/dist/plugin.js.map +1 -0
  36. package/ios/Sources/NativeAudioPlugin/AudioAsset+Fade.swift +157 -0
  37. package/ios/Sources/NativeAudioPlugin/AudioAsset.swift +403 -0
  38. package/ios/Sources/NativeAudioPlugin/Constant.swift +52 -0
  39. package/ios/Sources/NativeAudioPlugin/Logger.swift +43 -0
  40. package/ios/Sources/NativeAudioPlugin/Plugin.swift +1786 -0
  41. package/ios/Sources/NativeAudioPlugin/RemoteAudioAsset+Fade.swift +152 -0
  42. package/ios/Sources/NativeAudioPlugin/RemoteAudioAsset.swift +405 -0
  43. package/ios/Tests/NativeAudioPluginTests/PluginTests.swift +648 -0
  44. package/ios/Tests/README.md +39 -0
  45. package/package.json +101 -0
  46. package/scripts/configure-dependencies.js +251 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport { AudioAsset } from './audio-asset';\nimport type {\n Assets,\n AssetPauseOptions,\n AssetPlayOptions,\n AssetRate,\n AssetResumeOptions,\n AssetSetTime,\n AssetStopOptions,\n AssetVolume,\n ConfigureOptions,\n PlayOnceOptions,\n PlayOnceResult,\n PreloadOptions,\n} from './definitions';\nimport { NativeAudio } from './definitions';\n\ntype AudioAssetData = {\n fadeOut?: boolean;\n fadeOutStartTime?: number;\n fadeOutDuration?: number;\n fadeOutToStopTimer?: number;\n fadeInTimer?: number;\n startTimer?: number;\n volume?: number;\n volumeBeforePause?: number;\n};\n\nexport class NativeAudioWeb extends WebPlugin implements NativeAudio {\n private static readonly LOG_TAG: string = '[NativeAudioWeb]';\n private static readonly FILE_LOCATION: string = '';\n private static readonly DEFAULT_FADE_DURATION_SEC: number = 1;\n private static readonly CURRENT_TIME_UPDATE_INTERVAL: number = 100;\n\n private static readonly AUDIO_PRELOAD_OPTIONS_MAP: Map<string, PreloadOptions> = new Map<string, PreloadOptions>();\n private static readonly AUDIO_DATA_MAP: Map<string, AudioAssetData> = new Map<string, AudioAssetData>();\n private static readonly AUDIO_ASSET_BY_ASSET_ID: Map<string, AudioAsset> = new Map<string, AudioAsset>();\n private static readonly AUDIO_CONTEXT_MAP: Map<HTMLMediaElement, AudioContext> = new Map<\n HTMLMediaElement,\n AudioContext\n >();\n private static readonly MEDIA_ELEMENT_SOURCE_MAP: Map<HTMLMediaElement, MediaElementAudioSourceNode> = new Map<\n HTMLMediaElement,\n MediaElementAudioSourceNode\n >();\n private static readonly GAIN_NODE_MAP: Map<HTMLMediaElement, GainNode> = new Map<HTMLMediaElement, GainNode>();\n\n private static readonly playOnceAssets: Set<string> = new Set<string>();\n\n private debugMode = false;\n private currentTimeIntervals: Map<string, number> = new Map<string, number>();\n private readonly zeroVolume = 0.0001;\n\n constructor() {\n super();\n }\n\n async resume(options: AssetResumeOptions): Promise<void> {\n const audio: HTMLAudioElement = this.getAudioAsset(options.assetId).audio;\n const data = this.getAudioAssetData(options.assetId);\n const targetVolume = data.volumeBeforePause ?? data.volume ?? 1;\n\n if (options.fadeIn) {\n const fadeDuration = options.fadeInDuration || NativeAudioWeb.DEFAULT_FADE_DURATION_SEC;\n this.doFadeIn(audio, fadeDuration, targetVolume);\n } else if (audio.volume <= this.zeroVolume) {\n audio.volume = targetVolume;\n this.setGainNodeVolume(audio, targetVolume);\n }\n\n this.clearFadeOutToStopTimer(options.assetId);\n return this.doResume(options.assetId);\n }\n\n private async doResume(assetId: string): Promise<void> {\n const audio: HTMLAudioElement = this.getAudioAsset(assetId).audio;\n this.startCurrentTimeUpdates(assetId);\n if (audio.paused) {\n return audio.play();\n }\n }\n\n async pause(options: AssetPauseOptions): Promise<void> {\n const audio: HTMLAudioElement = this.getAudioAsset(options.assetId).audio;\n this.cancelGainNodeRamp(audio);\n\n const data = this.getAudioAssetData(options.assetId);\n data.volumeBeforePause = data.volume ?? audio.volume;\n this.setAudioAssetData(options.assetId, data);\n\n if (!audio.paused && options.fadeOut) {\n const fadeOutDuration = options.fadeOutDuration || NativeAudioWeb.DEFAULT_FADE_DURATION_SEC;\n this.doFadeOut(audio, fadeOutDuration);\n data.fadeOutToStopTimer = window.setTimeout(() => {\n this.doPause(options.assetId).catch(() => {\n // no-op\n });\n }, fadeOutDuration * 1000);\n this.setAudioAssetData(options.assetId, data);\n return;\n }\n\n return this.doPause(options.assetId);\n }\n\n private async doPause(assetId: string): Promise<void> {\n const audio: HTMLAudioElement = this.getAudioAsset(assetId).audio;\n this.clearFadeOutToStopTimer(assetId);\n this.stopCurrentTimeUpdates(assetId);\n audio.pause();\n }\n\n async setCurrentTime(options: AssetSetTime): Promise<void> {\n const audio: HTMLAudioElement = this.getAudioAsset(options.assetId).audio;\n audio.currentTime = options.time;\n }\n\n async getCurrentTime(options: Assets): Promise<{ currentTime: number }> {\n const audio: HTMLAudioElement = this.getAudioAsset(options.assetId).audio;\n return { currentTime: audio.currentTime };\n }\n\n async getDuration(options: Assets): Promise<{ duration: number }> {\n const audio: HTMLAudioElement = this.getAudioAsset(options.assetId).audio;\n if (Number.isNaN(audio.duration)) {\n throw 'no duration available';\n }\n if (!Number.isFinite(audio.duration)) {\n throw 'duration not available => media resource is streaming';\n }\n return { duration: audio.duration };\n }\n\n async setDebugMode(options: { enabled: boolean }): Promise<void> {\n this.debugMode = options.enabled;\n if (this.debugMode) {\n this.logInfo('Debug mode enabled');\n }\n }\n\n async configure(options: ConfigureOptions): Promise<void> {\n throw `configure is not supported for web: ${JSON.stringify(options)}`;\n }\n\n async isPreloaded(options: PreloadOptions): Promise<{ found: boolean }> {\n try {\n return { found: !!this.getAudioAsset(options.assetId) };\n } catch {\n return { found: false };\n }\n }\n\n async preload(options: PreloadOptions): Promise<void> {\n this.logInfo(`Preloading audio asset with options: ${JSON.stringify(options)}`);\n\n if (NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID.has(options.assetId)) {\n throw 'AssetId already exists. Unload first if like to change!';\n }\n if (!options.assetPath?.length) {\n throw 'no assetPath provided';\n }\n\n NativeAudioWeb.AUDIO_PRELOAD_OPTIONS_MAP.set(options.assetId, options);\n\n await new Promise<void>((resolve, reject) => {\n if (!options.isUrl && !new RegExp('^/?' + NativeAudioWeb.FILE_LOCATION).test(options.assetPath)) {\n const slashPrefix: string = options.assetPath.startsWith('/') ? '' : '/';\n options.assetPath = `${NativeAudioWeb.FILE_LOCATION}${slashPrefix}${options.assetPath}`;\n }\n\n const audio: HTMLAudioElement = document.createElement('audio');\n audio.id = options.assetId;\n audio.crossOrigin = 'anonymous';\n audio.src = options.assetPath;\n audio.autoplay = false;\n audio.loop = false;\n audio.preload = 'metadata';\n\n audio.addEventListener('loadedmetadata', () => {\n resolve();\n });\n\n audio.addEventListener('error', (errEvt) => {\n this.logError(`Error loading audio file: ${options.assetPath}, error: ${String(errEvt)}`);\n reject('Error loading audio file');\n });\n\n const data = this.getAudioAssetData(options.assetId);\n if (typeof options.volume === 'number') {\n audio.volume = options.volume;\n data.volume = options.volume;\n } else {\n data.volume = audio.volume;\n }\n\n NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID.set(options.assetId, new AudioAsset(audio));\n this.setAudioAssetData(options.assetId, data);\n this.setGainNodeVolume(audio, data.volume ?? 1);\n });\n }\n\n async playOnce(options: PlayOnceOptions): Promise<PlayOnceResult> {\n const assetId = `playOnce_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n NativeAudioWeb.playOnceAssets.add(assetId);\n\n const autoPlay = options.autoPlay !== false;\n const deleteAfterPlay = options.deleteAfterPlay ?? false;\n\n try {\n await this.preload({\n assetId,\n assetPath: options.assetPath,\n volume: options.volume,\n isUrl: options.isUrl,\n });\n\n const cleanupHandler = async () => {\n try {\n await this.unload({ assetId });\n NativeAudioWeb.playOnceAssets.delete(assetId);\n if (deleteAfterPlay) {\n console.warn('[NativeAudio] deleteAfterPlay is not supported on web platform. File deletion is ignored.');\n }\n } catch (error) {\n console.error('[NativeAudio] Error during playOnce cleanup:', error);\n }\n };\n\n if (autoPlay) {\n await this.doPlay({ assetId, volume: options.volume }, false);\n }\n\n const currentAudio = this.getAudioAsset(assetId).audio;\n currentAudio.addEventListener(\n 'ended',\n () => {\n cleanupHandler().catch((error) => {\n console.error('[NativeAudio] Error during ended cleanup:', error);\n });\n },\n { once: true },\n );\n\n currentAudio.addEventListener(\n 'error',\n () => {\n cleanupHandler().catch((error) => {\n console.error('[NativeAudio] Error during error cleanup:', error);\n });\n },\n { once: true },\n );\n\n return { assetId };\n } catch (error) {\n try {\n await this.unload({ assetId });\n NativeAudioWeb.playOnceAssets.delete(assetId);\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n }\n\n private onEnded(assetId: string): void {\n this.logDebug(`Playback ended for assetId: ${assetId}`);\n this.notifyListeners('complete', { assetId });\n }\n\n async play(options: AssetPlayOptions): Promise<void> {\n this.logInfo(`Playing audio asset with options: ${JSON.stringify(options)}`);\n\n this.clearFadeOutToStopTimer(options.assetId);\n\n const { delay = 0 } = options;\n if (delay > 0) {\n const data = this.getAudioAssetData(options.assetId);\n data.startTimer = window.setTimeout(() => {\n this.doPlay(options).catch((error) => {\n this.logError(`Delayed play failed: ${String(error)}`);\n });\n data.startTimer = undefined;\n this.setAudioAssetData(options.assetId, data);\n }, delay * 1000);\n this.setAudioAssetData(options.assetId, data);\n return;\n }\n\n await this.doPlay(options);\n }\n\n private async doPlay(options: AssetPlayOptions, recreateAudioElement = true): Promise<void> {\n const { assetId, time = 0 } = options;\n\n if (!NativeAudioWeb.AUDIO_PRELOAD_OPTIONS_MAP.has(assetId)) {\n throw `no asset for assetId \"${assetId}\" available. Call preload first!`;\n }\n\n if (recreateAudioElement) {\n const preloadOptions = NativeAudioWeb.AUDIO_PRELOAD_OPTIONS_MAP.get(assetId) as PreloadOptions;\n await this.unload({ assetId });\n await this.preload(preloadOptions);\n }\n\n const audio = this.getAudioAsset(assetId).audio;\n audio.id = assetId;\n audio.loop = false;\n audio.currentTime = time;\n audio.addEventListener('ended', () => this.onEnded(assetId), {\n once: true,\n });\n\n const data = this.getAudioAssetData(assetId);\n\n if (typeof options.volume === 'number') {\n audio.volume = options.volume;\n data.volume = options.volume;\n this.setGainNodeVolume(audio, options.volume);\n } else if (typeof data.volume !== 'number') {\n data.volume = audio.volume;\n }\n\n await audio.play();\n this.startCurrentTimeUpdates(assetId);\n\n if (options.fadeIn) {\n this.logDebug(`Fading in audio asset with assetId: ${assetId}`);\n const fadeDuration = options.fadeInDuration || NativeAudioWeb.DEFAULT_FADE_DURATION_SEC;\n this.doFadeIn(audio, fadeDuration);\n }\n\n if (options.fadeOut && !Number.isNaN(audio.duration) && Number.isFinite(audio.duration)) {\n this.logDebug(`Scheduling fade out for audio asset with assetId: ${assetId}`);\n const fadeOutDuration = options.fadeOutDuration || NativeAudioWeb.DEFAULT_FADE_DURATION_SEC;\n const fadeOutStartTime = options.fadeOutStartTime || audio.duration - fadeOutDuration;\n data.fadeOut = true;\n data.fadeOutStartTime = fadeOutStartTime;\n data.fadeOutDuration = fadeOutDuration;\n }\n\n this.setAudioAssetData(assetId, data);\n }\n\n private doFadeIn(audio: HTMLAudioElement, fadeDuration: number, targetVolume?: number): void {\n const data = this.getAudioAssetData(audio.id);\n this.setGainNodeVolume(audio, this.zeroVolume);\n const fadeToVolume = targetVolume ?? data.volume ?? 1;\n this.linearRampGainNodeVolume(audio, fadeToVolume, fadeDuration);\n data.fadeInTimer = window.setTimeout(() => {\n data.fadeInTimer = undefined;\n this.setAudioAssetData(audio.id, data);\n }, fadeDuration * 1000);\n this.setAudioAssetData(audio.id, data);\n }\n\n private doFadeOut(audio: HTMLAudioElement, fadeDuration: number): void {\n this.linearRampGainNodeVolume(audio, this.zeroVolume, fadeDuration);\n }\n\n async loop(options: Assets): Promise<void> {\n this.logInfo(`Looping audio asset with options: ${JSON.stringify(options)}`);\n const audio: HTMLAudioElement = this.getAudioAsset(options.assetId).audio;\n this.reset(audio);\n audio.loop = true;\n this.startCurrentTimeUpdates(options.assetId);\n return audio.play();\n }\n\n async stop(options: AssetStopOptions): Promise<void> {\n this.logInfo(`Stopping audio asset with options: ${JSON.stringify(options)}`);\n const audio: HTMLAudioElement = this.getAudioAsset(options.assetId).audio;\n const data = this.getAudioAssetData(options.assetId);\n\n this.clearFadeOutToStopTimer(options.assetId);\n this.cancelGainNodeRamp(audio);\n\n if (!audio.paused && options.fadeOut) {\n const fadeDuration = options.fadeOutDuration || NativeAudioWeb.DEFAULT_FADE_DURATION_SEC;\n this.doFadeOut(audio, fadeDuration);\n data.fadeOutToStopTimer = window.setTimeout(() => {\n this.doStop(audio, options);\n }, fadeDuration * 1000);\n this.setAudioAssetData(options.assetId, data);\n return;\n }\n\n this.doStop(audio, options);\n }\n\n private doStop(audio: HTMLAudioElement, options: AssetStopOptions): void {\n audio.pause();\n this.onEnded(options.assetId);\n this.reset(audio);\n }\n\n private reset(audio: HTMLAudioElement): void {\n audio.currentTime = 0;\n\n for (const [assetId, asset] of NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID.entries()) {\n if (asset.audio === audio) {\n this.stopCurrentTimeUpdates(assetId);\n this.clearFadeOutToStopTimer(assetId);\n this.clearStartTimer(assetId);\n this.cancelGainNodeRamp(audio);\n const data = this.getAudioAssetData(assetId);\n const initialVolume = data.volume ?? 1;\n this.setGainNodeVolume(audio, initialVolume);\n this.setAudioAssetData(assetId, data);\n break;\n }\n }\n }\n\n private clearFadeOutToStopTimer(assetId: string): void {\n const data = this.getAudioAssetData(assetId);\n if (data.fadeOutToStopTimer) {\n clearTimeout(data.fadeOutToStopTimer);\n data.fadeOutToStopTimer = undefined;\n this.setAudioAssetData(assetId, data);\n }\n }\n\n private clearStartTimer(assetId: string): void {\n const data = this.getAudioAssetData(assetId);\n if (data.startTimer) {\n clearTimeout(data.startTimer);\n data.startTimer = undefined;\n this.setAudioAssetData(assetId, data);\n }\n }\n\n async unload(options: Assets): Promise<void> {\n this.logInfo(`Unloading audio asset with options: ${JSON.stringify(options)}`);\n const audio: HTMLAudioElement = this.getAudioAsset(options.assetId).audio;\n this.reset(audio);\n NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID.delete(options.assetId);\n NativeAudioWeb.AUDIO_PRELOAD_OPTIONS_MAP.delete(options.assetId);\n NativeAudioWeb.AUDIO_DATA_MAP.delete(options.assetId);\n this.cleanupAudioContext(audio);\n }\n\n private cleanupAudioContext(audio: HTMLMediaElement): void {\n const gainNode = NativeAudioWeb.GAIN_NODE_MAP.get(audio);\n if (gainNode) {\n gainNode.disconnect();\n NativeAudioWeb.GAIN_NODE_MAP.delete(audio);\n }\n\n const sourceNode = NativeAudioWeb.MEDIA_ELEMENT_SOURCE_MAP.get(audio);\n if (sourceNode) {\n sourceNode.disconnect();\n NativeAudioWeb.MEDIA_ELEMENT_SOURCE_MAP.delete(audio);\n }\n\n const audioContext = NativeAudioWeb.AUDIO_CONTEXT_MAP.get(audio);\n if (audioContext) {\n audioContext.close().catch(() => {\n // no-op\n });\n NativeAudioWeb.AUDIO_CONTEXT_MAP.delete(audio);\n }\n }\n\n async setVolume(options: AssetVolume): Promise<void> {\n this.logInfo(`Setting volume for audio asset with options: ${JSON.stringify(options)}`);\n\n if (typeof options?.volume !== 'number') {\n throw 'no volume provided';\n }\n\n const { volume, duration = 0 } = options;\n\n const data = this.getAudioAssetData(options.assetId);\n data.volume = volume;\n this.setAudioAssetData(options.assetId, data);\n\n const audio: HTMLAudioElement = this.getAudioAsset(options.assetId).audio;\n this.cancelGainNodeRamp(audio);\n\n if (duration > 0) {\n this.exponentialRampGainNodeVolume(audio, volume, duration);\n return;\n }\n\n audio.volume = volume;\n this.setGainNodeVolume(audio, volume);\n }\n\n async setRate(options: AssetRate): Promise<void> {\n this.logInfo(`Setting playback rate for audio asset with options: ${JSON.stringify(options)}`);\n\n if (typeof options?.rate !== 'number') {\n throw 'no rate provided';\n }\n\n const audio: HTMLAudioElement = this.getAudioAsset(options.assetId).audio;\n audio.playbackRate = options.rate;\n }\n\n async isPlaying(options: Assets): Promise<{ isPlaying: boolean }> {\n const audio: HTMLAudioElement = this.getAudioAsset(options.assetId).audio;\n return { isPlaying: !audio.paused };\n }\n\n async clearCache(): Promise<void> {\n this.logWarning('clearCache is not supported for web. No cache to clear.');\n }\n\n private getAudioAsset(assetId: string): AudioAsset {\n this.checkAssetId(assetId);\n\n if (!NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID.has(assetId)) {\n throw `no asset for assetId \"${assetId}\" available. Call preload first!`;\n }\n\n return NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID.get(assetId) as AudioAsset;\n }\n\n private checkAssetId(assetId: string): void {\n if (typeof assetId !== 'string') {\n throw 'assetId must be a string';\n }\n\n if (!assetId?.length) {\n throw 'no assetId provided';\n }\n }\n\n private getOrCreateAudioContext(audio: HTMLMediaElement): AudioContext {\n if (NativeAudioWeb.AUDIO_CONTEXT_MAP.has(audio)) {\n return NativeAudioWeb.AUDIO_CONTEXT_MAP.get(audio) as AudioContext;\n }\n\n const audioContext = new AudioContext();\n NativeAudioWeb.AUDIO_CONTEXT_MAP.set(audio, audioContext);\n return audioContext;\n }\n\n private getOrCreateMediaElementSource(\n audioContext: AudioContext,\n audio: HTMLAudioElement,\n ): MediaElementAudioSourceNode {\n if (NativeAudioWeb.MEDIA_ELEMENT_SOURCE_MAP.has(audio)) {\n return NativeAudioWeb.MEDIA_ELEMENT_SOURCE_MAP.get(audio) as MediaElementAudioSourceNode;\n }\n\n const sourceNode = audioContext.createMediaElementSource(audio);\n NativeAudioWeb.MEDIA_ELEMENT_SOURCE_MAP.set(audio, sourceNode);\n return sourceNode;\n }\n\n private getOrCreateGainNode(audio: HTMLMediaElement, track: MediaElementAudioSourceNode): GainNode {\n const audioContext = this.getOrCreateAudioContext(audio);\n\n if (NativeAudioWeb.GAIN_NODE_MAP.has(audio)) {\n return NativeAudioWeb.GAIN_NODE_MAP.get(audio) as GainNode;\n }\n\n const gainNode = audioContext.createGain();\n track.connect(gainNode).connect(audioContext.destination);\n NativeAudioWeb.GAIN_NODE_MAP.set(audio, gainNode);\n return gainNode;\n }\n\n private setGainNodeVolume(audio: HTMLMediaElement, volume: number, time?: number): void {\n const audioContext = this.getOrCreateAudioContext(audio);\n const track = this.getOrCreateMediaElementSource(audioContext, audio as HTMLAudioElement);\n const gainNode = this.getOrCreateGainNode(audio, track);\n\n if (time !== undefined) {\n gainNode.gain.setValueAtTime(volume, time);\n } else {\n gainNode.gain.setValueAtTime(volume, audioContext.currentTime);\n }\n }\n\n private exponentialRampGainNodeVolume(audio: HTMLMediaElement, volume: number, duration: number): void {\n const audioContext = this.getOrCreateAudioContext(audio);\n const track = this.getOrCreateMediaElementSource(audioContext, audio as HTMLAudioElement);\n const gainNode = this.getOrCreateGainNode(audio, track);\n const adjustedVolume = volume < this.zeroVolume ? this.zeroVolume : volume;\n gainNode.gain.exponentialRampToValueAtTime(adjustedVolume, audioContext.currentTime + duration);\n }\n\n private linearRampGainNodeVolume(audio: HTMLMediaElement, volume: number, duration: number): void {\n const audioContext = this.getOrCreateAudioContext(audio);\n const track = this.getOrCreateMediaElementSource(audioContext, audio as HTMLAudioElement);\n const gainNode = this.getOrCreateGainNode(audio, track);\n gainNode.gain.linearRampToValueAtTime(volume, audioContext.currentTime + duration);\n }\n\n private cancelGainNodeRamp(audio: HTMLMediaElement): void {\n const gainNode = NativeAudioWeb.GAIN_NODE_MAP.get(audio);\n if (gainNode) {\n gainNode.gain.cancelScheduledValues(0);\n }\n }\n\n private startCurrentTimeUpdates(assetId: string): void {\n this.stopCurrentTimeUpdates(assetId);\n\n const audio = this.getAudioAsset(assetId).audio;\n const intervalId = window.setInterval(() => {\n if (!audio.paused) {\n const currentTime = Math.round(audio.currentTime * 10) / 10;\n this.notifyListeners('currentTime', { assetId, currentTime });\n this.logDebug(`Current time update for assetId: ${assetId}, currentTime: ${currentTime}`);\n\n const data = this.getAudioAssetData(assetId);\n if (data.fadeOut && typeof data.fadeOutStartTime === 'number' && currentTime >= data.fadeOutStartTime) {\n this.cancelGainNodeRamp(audio);\n const fadeOutDuration = data.fadeOutDuration ?? NativeAudioWeb.DEFAULT_FADE_DURATION_SEC;\n this.doFadeOut(audio, fadeOutDuration);\n data.fadeOut = false;\n this.setAudioAssetData(assetId, data);\n }\n } else {\n this.stopCurrentTimeUpdates(assetId);\n }\n }, NativeAudioWeb.CURRENT_TIME_UPDATE_INTERVAL);\n\n this.currentTimeIntervals.set(assetId, intervalId);\n }\n\n private stopCurrentTimeUpdates(assetId?: string): void {\n if (assetId) {\n const intervalId = this.currentTimeIntervals.get(assetId);\n if (intervalId) {\n clearInterval(intervalId);\n this.currentTimeIntervals.delete(assetId);\n }\n return;\n }\n\n for (const intervalId of this.currentTimeIntervals.values()) {\n clearInterval(intervalId);\n }\n this.currentTimeIntervals.clear();\n }\n\n private getAudioAssetData(assetId: string): AudioAssetData {\n return NativeAudioWeb.AUDIO_DATA_MAP.get(assetId) || {};\n }\n\n private setAudioAssetData(assetId: string, data: AudioAssetData): void {\n const currentData = NativeAudioWeb.AUDIO_DATA_MAP.get(assetId) || {};\n const newData = { ...currentData, ...data };\n NativeAudioWeb.AUDIO_DATA_MAP.set(assetId, newData);\n }\n\n private logError(message: string): void {\n if (!this.debugMode) return;\n console.error(`${NativeAudioWeb.LOG_TAG} Error: ${message}`);\n }\n\n private logWarning(message: string): void {\n if (!this.debugMode) return;\n console.warn(`${NativeAudioWeb.LOG_TAG} Warning: ${message}`);\n }\n\n private logInfo(message: string): void {\n if (!this.debugMode) return;\n console.info(`${NativeAudioWeb.LOG_TAG} Info: ${message}`);\n }\n\n private logDebug(message: string): void {\n if (!this.debugMode) return;\n console.debug(`${NativeAudioWeb.LOG_TAG} Debug: ${message}`);\n }\n\n async getPluginVersion(): Promise<{ version: string }> {\n return { version: 'web' };\n }\n\n async deinitPlugin(): Promise<void> {\n for (const [assetId] of NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID) {\n await this.unload({ assetId });\n }\n this.stopCurrentTimeUpdates();\n }\n}\n\nconst NativeAudio = new NativeAudioWeb();\n\nexport { NativeAudio };\n"]}
@@ -0,0 +1,571 @@
1
+ 'use strict';
2
+
3
+ var core = require('@capacitor/core');
4
+
5
+ const NativeAudio = core.registerPlugin('NativeAudio', {
6
+ web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.NativeAudioWeb()),
7
+ });
8
+
9
+ class AudioAsset {
10
+ constructor(audio) {
11
+ this.audio = audio;
12
+ }
13
+ }
14
+
15
+ class NativeAudioWeb extends core.WebPlugin {
16
+ constructor() {
17
+ super();
18
+ this.debugMode = false;
19
+ this.currentTimeIntervals = new Map();
20
+ this.zeroVolume = 0.0001;
21
+ }
22
+ async resume(options) {
23
+ var _a, _b;
24
+ const audio = this.getAudioAsset(options.assetId).audio;
25
+ const data = this.getAudioAssetData(options.assetId);
26
+ const targetVolume = (_b = (_a = data.volumeBeforePause) !== null && _a !== void 0 ? _a : data.volume) !== null && _b !== void 0 ? _b : 1;
27
+ if (options.fadeIn) {
28
+ const fadeDuration = options.fadeInDuration || NativeAudioWeb.DEFAULT_FADE_DURATION_SEC;
29
+ this.doFadeIn(audio, fadeDuration, targetVolume);
30
+ }
31
+ else if (audio.volume <= this.zeroVolume) {
32
+ audio.volume = targetVolume;
33
+ this.setGainNodeVolume(audio, targetVolume);
34
+ }
35
+ this.clearFadeOutToStopTimer(options.assetId);
36
+ return this.doResume(options.assetId);
37
+ }
38
+ async doResume(assetId) {
39
+ const audio = this.getAudioAsset(assetId).audio;
40
+ this.startCurrentTimeUpdates(assetId);
41
+ if (audio.paused) {
42
+ return audio.play();
43
+ }
44
+ }
45
+ async pause(options) {
46
+ var _a;
47
+ const audio = this.getAudioAsset(options.assetId).audio;
48
+ this.cancelGainNodeRamp(audio);
49
+ const data = this.getAudioAssetData(options.assetId);
50
+ data.volumeBeforePause = (_a = data.volume) !== null && _a !== void 0 ? _a : audio.volume;
51
+ this.setAudioAssetData(options.assetId, data);
52
+ if (!audio.paused && options.fadeOut) {
53
+ const fadeOutDuration = options.fadeOutDuration || NativeAudioWeb.DEFAULT_FADE_DURATION_SEC;
54
+ this.doFadeOut(audio, fadeOutDuration);
55
+ data.fadeOutToStopTimer = window.setTimeout(() => {
56
+ this.doPause(options.assetId).catch(() => {
57
+ // no-op
58
+ });
59
+ }, fadeOutDuration * 1000);
60
+ this.setAudioAssetData(options.assetId, data);
61
+ return;
62
+ }
63
+ return this.doPause(options.assetId);
64
+ }
65
+ async doPause(assetId) {
66
+ const audio = this.getAudioAsset(assetId).audio;
67
+ this.clearFadeOutToStopTimer(assetId);
68
+ this.stopCurrentTimeUpdates(assetId);
69
+ audio.pause();
70
+ }
71
+ async setCurrentTime(options) {
72
+ const audio = this.getAudioAsset(options.assetId).audio;
73
+ audio.currentTime = options.time;
74
+ }
75
+ async getCurrentTime(options) {
76
+ const audio = this.getAudioAsset(options.assetId).audio;
77
+ return { currentTime: audio.currentTime };
78
+ }
79
+ async getDuration(options) {
80
+ const audio = this.getAudioAsset(options.assetId).audio;
81
+ if (Number.isNaN(audio.duration)) {
82
+ throw 'no duration available';
83
+ }
84
+ if (!Number.isFinite(audio.duration)) {
85
+ throw 'duration not available => media resource is streaming';
86
+ }
87
+ return { duration: audio.duration };
88
+ }
89
+ async setDebugMode(options) {
90
+ this.debugMode = options.enabled;
91
+ if (this.debugMode) {
92
+ this.logInfo('Debug mode enabled');
93
+ }
94
+ }
95
+ async configure(options) {
96
+ throw `configure is not supported for web: ${JSON.stringify(options)}`;
97
+ }
98
+ async isPreloaded(options) {
99
+ try {
100
+ return { found: !!this.getAudioAsset(options.assetId) };
101
+ }
102
+ catch (_a) {
103
+ return { found: false };
104
+ }
105
+ }
106
+ async preload(options) {
107
+ var _a;
108
+ this.logInfo(`Preloading audio asset with options: ${JSON.stringify(options)}`);
109
+ if (NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID.has(options.assetId)) {
110
+ throw 'AssetId already exists. Unload first if like to change!';
111
+ }
112
+ if (!((_a = options.assetPath) === null || _a === void 0 ? void 0 : _a.length)) {
113
+ throw 'no assetPath provided';
114
+ }
115
+ NativeAudioWeb.AUDIO_PRELOAD_OPTIONS_MAP.set(options.assetId, options);
116
+ await new Promise((resolve, reject) => {
117
+ var _a;
118
+ if (!options.isUrl && !new RegExp('^/?' + NativeAudioWeb.FILE_LOCATION).test(options.assetPath)) {
119
+ const slashPrefix = options.assetPath.startsWith('/') ? '' : '/';
120
+ options.assetPath = `${NativeAudioWeb.FILE_LOCATION}${slashPrefix}${options.assetPath}`;
121
+ }
122
+ const audio = document.createElement('audio');
123
+ audio.id = options.assetId;
124
+ audio.crossOrigin = 'anonymous';
125
+ audio.src = options.assetPath;
126
+ audio.autoplay = false;
127
+ audio.loop = false;
128
+ audio.preload = 'metadata';
129
+ audio.addEventListener('loadedmetadata', () => {
130
+ resolve();
131
+ });
132
+ audio.addEventListener('error', (errEvt) => {
133
+ this.logError(`Error loading audio file: ${options.assetPath}, error: ${String(errEvt)}`);
134
+ reject('Error loading audio file');
135
+ });
136
+ const data = this.getAudioAssetData(options.assetId);
137
+ if (typeof options.volume === 'number') {
138
+ audio.volume = options.volume;
139
+ data.volume = options.volume;
140
+ }
141
+ else {
142
+ data.volume = audio.volume;
143
+ }
144
+ NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID.set(options.assetId, new AudioAsset(audio));
145
+ this.setAudioAssetData(options.assetId, data);
146
+ this.setGainNodeVolume(audio, (_a = data.volume) !== null && _a !== void 0 ? _a : 1);
147
+ });
148
+ }
149
+ async playOnce(options) {
150
+ var _a;
151
+ const assetId = `playOnce_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
152
+ NativeAudioWeb.playOnceAssets.add(assetId);
153
+ const autoPlay = options.autoPlay !== false;
154
+ const deleteAfterPlay = (_a = options.deleteAfterPlay) !== null && _a !== void 0 ? _a : false;
155
+ try {
156
+ await this.preload({
157
+ assetId,
158
+ assetPath: options.assetPath,
159
+ volume: options.volume,
160
+ isUrl: options.isUrl,
161
+ });
162
+ const cleanupHandler = async () => {
163
+ try {
164
+ await this.unload({ assetId });
165
+ NativeAudioWeb.playOnceAssets.delete(assetId);
166
+ if (deleteAfterPlay) {
167
+ console.warn('[NativeAudio] deleteAfterPlay is not supported on web platform. File deletion is ignored.');
168
+ }
169
+ }
170
+ catch (error) {
171
+ console.error('[NativeAudio] Error during playOnce cleanup:', error);
172
+ }
173
+ };
174
+ if (autoPlay) {
175
+ await this.doPlay({ assetId, volume: options.volume }, false);
176
+ }
177
+ const currentAudio = this.getAudioAsset(assetId).audio;
178
+ currentAudio.addEventListener('ended', () => {
179
+ cleanupHandler().catch((error) => {
180
+ console.error('[NativeAudio] Error during ended cleanup:', error);
181
+ });
182
+ }, { once: true });
183
+ currentAudio.addEventListener('error', () => {
184
+ cleanupHandler().catch((error) => {
185
+ console.error('[NativeAudio] Error during error cleanup:', error);
186
+ });
187
+ }, { once: true });
188
+ return { assetId };
189
+ }
190
+ catch (error) {
191
+ try {
192
+ await this.unload({ assetId });
193
+ NativeAudioWeb.playOnceAssets.delete(assetId);
194
+ }
195
+ catch (_b) {
196
+ // Ignore cleanup errors
197
+ }
198
+ throw error;
199
+ }
200
+ }
201
+ onEnded(assetId) {
202
+ this.logDebug(`Playback ended for assetId: ${assetId}`);
203
+ this.notifyListeners('complete', { assetId });
204
+ }
205
+ async play(options) {
206
+ this.logInfo(`Playing audio asset with options: ${JSON.stringify(options)}`);
207
+ this.clearFadeOutToStopTimer(options.assetId);
208
+ const { delay = 0 } = options;
209
+ if (delay > 0) {
210
+ const data = this.getAudioAssetData(options.assetId);
211
+ data.startTimer = window.setTimeout(() => {
212
+ this.doPlay(options).catch((error) => {
213
+ this.logError(`Delayed play failed: ${String(error)}`);
214
+ });
215
+ data.startTimer = undefined;
216
+ this.setAudioAssetData(options.assetId, data);
217
+ }, delay * 1000);
218
+ this.setAudioAssetData(options.assetId, data);
219
+ return;
220
+ }
221
+ await this.doPlay(options);
222
+ }
223
+ async doPlay(options, recreateAudioElement = true) {
224
+ const { assetId, time = 0 } = options;
225
+ if (!NativeAudioWeb.AUDIO_PRELOAD_OPTIONS_MAP.has(assetId)) {
226
+ throw `no asset for assetId "${assetId}" available. Call preload first!`;
227
+ }
228
+ if (recreateAudioElement) {
229
+ const preloadOptions = NativeAudioWeb.AUDIO_PRELOAD_OPTIONS_MAP.get(assetId);
230
+ await this.unload({ assetId });
231
+ await this.preload(preloadOptions);
232
+ }
233
+ const audio = this.getAudioAsset(assetId).audio;
234
+ audio.id = assetId;
235
+ audio.loop = false;
236
+ audio.currentTime = time;
237
+ audio.addEventListener('ended', () => this.onEnded(assetId), {
238
+ once: true,
239
+ });
240
+ const data = this.getAudioAssetData(assetId);
241
+ if (typeof options.volume === 'number') {
242
+ audio.volume = options.volume;
243
+ data.volume = options.volume;
244
+ this.setGainNodeVolume(audio, options.volume);
245
+ }
246
+ else if (typeof data.volume !== 'number') {
247
+ data.volume = audio.volume;
248
+ }
249
+ await audio.play();
250
+ this.startCurrentTimeUpdates(assetId);
251
+ if (options.fadeIn) {
252
+ this.logDebug(`Fading in audio asset with assetId: ${assetId}`);
253
+ const fadeDuration = options.fadeInDuration || NativeAudioWeb.DEFAULT_FADE_DURATION_SEC;
254
+ this.doFadeIn(audio, fadeDuration);
255
+ }
256
+ if (options.fadeOut && !Number.isNaN(audio.duration) && Number.isFinite(audio.duration)) {
257
+ this.logDebug(`Scheduling fade out for audio asset with assetId: ${assetId}`);
258
+ const fadeOutDuration = options.fadeOutDuration || NativeAudioWeb.DEFAULT_FADE_DURATION_SEC;
259
+ const fadeOutStartTime = options.fadeOutStartTime || audio.duration - fadeOutDuration;
260
+ data.fadeOut = true;
261
+ data.fadeOutStartTime = fadeOutStartTime;
262
+ data.fadeOutDuration = fadeOutDuration;
263
+ }
264
+ this.setAudioAssetData(assetId, data);
265
+ }
266
+ doFadeIn(audio, fadeDuration, targetVolume) {
267
+ var _a;
268
+ const data = this.getAudioAssetData(audio.id);
269
+ this.setGainNodeVolume(audio, this.zeroVolume);
270
+ const fadeToVolume = (_a = targetVolume !== null && targetVolume !== void 0 ? targetVolume : data.volume) !== null && _a !== void 0 ? _a : 1;
271
+ this.linearRampGainNodeVolume(audio, fadeToVolume, fadeDuration);
272
+ data.fadeInTimer = window.setTimeout(() => {
273
+ data.fadeInTimer = undefined;
274
+ this.setAudioAssetData(audio.id, data);
275
+ }, fadeDuration * 1000);
276
+ this.setAudioAssetData(audio.id, data);
277
+ }
278
+ doFadeOut(audio, fadeDuration) {
279
+ this.linearRampGainNodeVolume(audio, this.zeroVolume, fadeDuration);
280
+ }
281
+ async loop(options) {
282
+ this.logInfo(`Looping audio asset with options: ${JSON.stringify(options)}`);
283
+ const audio = this.getAudioAsset(options.assetId).audio;
284
+ this.reset(audio);
285
+ audio.loop = true;
286
+ this.startCurrentTimeUpdates(options.assetId);
287
+ return audio.play();
288
+ }
289
+ async stop(options) {
290
+ this.logInfo(`Stopping audio asset with options: ${JSON.stringify(options)}`);
291
+ const audio = this.getAudioAsset(options.assetId).audio;
292
+ const data = this.getAudioAssetData(options.assetId);
293
+ this.clearFadeOutToStopTimer(options.assetId);
294
+ this.cancelGainNodeRamp(audio);
295
+ if (!audio.paused && options.fadeOut) {
296
+ const fadeDuration = options.fadeOutDuration || NativeAudioWeb.DEFAULT_FADE_DURATION_SEC;
297
+ this.doFadeOut(audio, fadeDuration);
298
+ data.fadeOutToStopTimer = window.setTimeout(() => {
299
+ this.doStop(audio, options);
300
+ }, fadeDuration * 1000);
301
+ this.setAudioAssetData(options.assetId, data);
302
+ return;
303
+ }
304
+ this.doStop(audio, options);
305
+ }
306
+ doStop(audio, options) {
307
+ audio.pause();
308
+ this.onEnded(options.assetId);
309
+ this.reset(audio);
310
+ }
311
+ reset(audio) {
312
+ var _a;
313
+ audio.currentTime = 0;
314
+ for (const [assetId, asset] of NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID.entries()) {
315
+ if (asset.audio === audio) {
316
+ this.stopCurrentTimeUpdates(assetId);
317
+ this.clearFadeOutToStopTimer(assetId);
318
+ this.clearStartTimer(assetId);
319
+ this.cancelGainNodeRamp(audio);
320
+ const data = this.getAudioAssetData(assetId);
321
+ const initialVolume = (_a = data.volume) !== null && _a !== void 0 ? _a : 1;
322
+ this.setGainNodeVolume(audio, initialVolume);
323
+ this.setAudioAssetData(assetId, data);
324
+ break;
325
+ }
326
+ }
327
+ }
328
+ clearFadeOutToStopTimer(assetId) {
329
+ const data = this.getAudioAssetData(assetId);
330
+ if (data.fadeOutToStopTimer) {
331
+ clearTimeout(data.fadeOutToStopTimer);
332
+ data.fadeOutToStopTimer = undefined;
333
+ this.setAudioAssetData(assetId, data);
334
+ }
335
+ }
336
+ clearStartTimer(assetId) {
337
+ const data = this.getAudioAssetData(assetId);
338
+ if (data.startTimer) {
339
+ clearTimeout(data.startTimer);
340
+ data.startTimer = undefined;
341
+ this.setAudioAssetData(assetId, data);
342
+ }
343
+ }
344
+ async unload(options) {
345
+ this.logInfo(`Unloading audio asset with options: ${JSON.stringify(options)}`);
346
+ const audio = this.getAudioAsset(options.assetId).audio;
347
+ this.reset(audio);
348
+ NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID.delete(options.assetId);
349
+ NativeAudioWeb.AUDIO_PRELOAD_OPTIONS_MAP.delete(options.assetId);
350
+ NativeAudioWeb.AUDIO_DATA_MAP.delete(options.assetId);
351
+ this.cleanupAudioContext(audio);
352
+ }
353
+ cleanupAudioContext(audio) {
354
+ const gainNode = NativeAudioWeb.GAIN_NODE_MAP.get(audio);
355
+ if (gainNode) {
356
+ gainNode.disconnect();
357
+ NativeAudioWeb.GAIN_NODE_MAP.delete(audio);
358
+ }
359
+ const sourceNode = NativeAudioWeb.MEDIA_ELEMENT_SOURCE_MAP.get(audio);
360
+ if (sourceNode) {
361
+ sourceNode.disconnect();
362
+ NativeAudioWeb.MEDIA_ELEMENT_SOURCE_MAP.delete(audio);
363
+ }
364
+ const audioContext = NativeAudioWeb.AUDIO_CONTEXT_MAP.get(audio);
365
+ if (audioContext) {
366
+ audioContext.close().catch(() => {
367
+ // no-op
368
+ });
369
+ NativeAudioWeb.AUDIO_CONTEXT_MAP.delete(audio);
370
+ }
371
+ }
372
+ async setVolume(options) {
373
+ this.logInfo(`Setting volume for audio asset with options: ${JSON.stringify(options)}`);
374
+ if (typeof (options === null || options === void 0 ? void 0 : options.volume) !== 'number') {
375
+ throw 'no volume provided';
376
+ }
377
+ const { volume, duration = 0 } = options;
378
+ const data = this.getAudioAssetData(options.assetId);
379
+ data.volume = volume;
380
+ this.setAudioAssetData(options.assetId, data);
381
+ const audio = this.getAudioAsset(options.assetId).audio;
382
+ this.cancelGainNodeRamp(audio);
383
+ if (duration > 0) {
384
+ this.exponentialRampGainNodeVolume(audio, volume, duration);
385
+ return;
386
+ }
387
+ audio.volume = volume;
388
+ this.setGainNodeVolume(audio, volume);
389
+ }
390
+ async setRate(options) {
391
+ this.logInfo(`Setting playback rate for audio asset with options: ${JSON.stringify(options)}`);
392
+ if (typeof (options === null || options === void 0 ? void 0 : options.rate) !== 'number') {
393
+ throw 'no rate provided';
394
+ }
395
+ const audio = this.getAudioAsset(options.assetId).audio;
396
+ audio.playbackRate = options.rate;
397
+ }
398
+ async isPlaying(options) {
399
+ const audio = this.getAudioAsset(options.assetId).audio;
400
+ return { isPlaying: !audio.paused };
401
+ }
402
+ async clearCache() {
403
+ this.logWarning('clearCache is not supported for web. No cache to clear.');
404
+ }
405
+ getAudioAsset(assetId) {
406
+ this.checkAssetId(assetId);
407
+ if (!NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID.has(assetId)) {
408
+ throw `no asset for assetId "${assetId}" available. Call preload first!`;
409
+ }
410
+ return NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID.get(assetId);
411
+ }
412
+ checkAssetId(assetId) {
413
+ if (typeof assetId !== 'string') {
414
+ throw 'assetId must be a string';
415
+ }
416
+ if (!(assetId === null || assetId === void 0 ? void 0 : assetId.length)) {
417
+ throw 'no assetId provided';
418
+ }
419
+ }
420
+ getOrCreateAudioContext(audio) {
421
+ if (NativeAudioWeb.AUDIO_CONTEXT_MAP.has(audio)) {
422
+ return NativeAudioWeb.AUDIO_CONTEXT_MAP.get(audio);
423
+ }
424
+ const audioContext = new AudioContext();
425
+ NativeAudioWeb.AUDIO_CONTEXT_MAP.set(audio, audioContext);
426
+ return audioContext;
427
+ }
428
+ getOrCreateMediaElementSource(audioContext, audio) {
429
+ if (NativeAudioWeb.MEDIA_ELEMENT_SOURCE_MAP.has(audio)) {
430
+ return NativeAudioWeb.MEDIA_ELEMENT_SOURCE_MAP.get(audio);
431
+ }
432
+ const sourceNode = audioContext.createMediaElementSource(audio);
433
+ NativeAudioWeb.MEDIA_ELEMENT_SOURCE_MAP.set(audio, sourceNode);
434
+ return sourceNode;
435
+ }
436
+ getOrCreateGainNode(audio, track) {
437
+ const audioContext = this.getOrCreateAudioContext(audio);
438
+ if (NativeAudioWeb.GAIN_NODE_MAP.has(audio)) {
439
+ return NativeAudioWeb.GAIN_NODE_MAP.get(audio);
440
+ }
441
+ const gainNode = audioContext.createGain();
442
+ track.connect(gainNode).connect(audioContext.destination);
443
+ NativeAudioWeb.GAIN_NODE_MAP.set(audio, gainNode);
444
+ return gainNode;
445
+ }
446
+ setGainNodeVolume(audio, volume, time) {
447
+ const audioContext = this.getOrCreateAudioContext(audio);
448
+ const track = this.getOrCreateMediaElementSource(audioContext, audio);
449
+ const gainNode = this.getOrCreateGainNode(audio, track);
450
+ if (time !== undefined) {
451
+ gainNode.gain.setValueAtTime(volume, time);
452
+ }
453
+ else {
454
+ gainNode.gain.setValueAtTime(volume, audioContext.currentTime);
455
+ }
456
+ }
457
+ exponentialRampGainNodeVolume(audio, volume, duration) {
458
+ const audioContext = this.getOrCreateAudioContext(audio);
459
+ const track = this.getOrCreateMediaElementSource(audioContext, audio);
460
+ const gainNode = this.getOrCreateGainNode(audio, track);
461
+ const adjustedVolume = volume < this.zeroVolume ? this.zeroVolume : volume;
462
+ gainNode.gain.exponentialRampToValueAtTime(adjustedVolume, audioContext.currentTime + duration);
463
+ }
464
+ linearRampGainNodeVolume(audio, volume, duration) {
465
+ const audioContext = this.getOrCreateAudioContext(audio);
466
+ const track = this.getOrCreateMediaElementSource(audioContext, audio);
467
+ const gainNode = this.getOrCreateGainNode(audio, track);
468
+ gainNode.gain.linearRampToValueAtTime(volume, audioContext.currentTime + duration);
469
+ }
470
+ cancelGainNodeRamp(audio) {
471
+ const gainNode = NativeAudioWeb.GAIN_NODE_MAP.get(audio);
472
+ if (gainNode) {
473
+ gainNode.gain.cancelScheduledValues(0);
474
+ }
475
+ }
476
+ startCurrentTimeUpdates(assetId) {
477
+ this.stopCurrentTimeUpdates(assetId);
478
+ const audio = this.getAudioAsset(assetId).audio;
479
+ const intervalId = window.setInterval(() => {
480
+ var _a;
481
+ if (!audio.paused) {
482
+ const currentTime = Math.round(audio.currentTime * 10) / 10;
483
+ this.notifyListeners('currentTime', { assetId, currentTime });
484
+ this.logDebug(`Current time update for assetId: ${assetId}, currentTime: ${currentTime}`);
485
+ const data = this.getAudioAssetData(assetId);
486
+ if (data.fadeOut && typeof data.fadeOutStartTime === 'number' && currentTime >= data.fadeOutStartTime) {
487
+ this.cancelGainNodeRamp(audio);
488
+ const fadeOutDuration = (_a = data.fadeOutDuration) !== null && _a !== void 0 ? _a : NativeAudioWeb.DEFAULT_FADE_DURATION_SEC;
489
+ this.doFadeOut(audio, fadeOutDuration);
490
+ data.fadeOut = false;
491
+ this.setAudioAssetData(assetId, data);
492
+ }
493
+ }
494
+ else {
495
+ this.stopCurrentTimeUpdates(assetId);
496
+ }
497
+ }, NativeAudioWeb.CURRENT_TIME_UPDATE_INTERVAL);
498
+ this.currentTimeIntervals.set(assetId, intervalId);
499
+ }
500
+ stopCurrentTimeUpdates(assetId) {
501
+ if (assetId) {
502
+ const intervalId = this.currentTimeIntervals.get(assetId);
503
+ if (intervalId) {
504
+ clearInterval(intervalId);
505
+ this.currentTimeIntervals.delete(assetId);
506
+ }
507
+ return;
508
+ }
509
+ for (const intervalId of this.currentTimeIntervals.values()) {
510
+ clearInterval(intervalId);
511
+ }
512
+ this.currentTimeIntervals.clear();
513
+ }
514
+ getAudioAssetData(assetId) {
515
+ return NativeAudioWeb.AUDIO_DATA_MAP.get(assetId) || {};
516
+ }
517
+ setAudioAssetData(assetId, data) {
518
+ const currentData = NativeAudioWeb.AUDIO_DATA_MAP.get(assetId) || {};
519
+ const newData = Object.assign(Object.assign({}, currentData), data);
520
+ NativeAudioWeb.AUDIO_DATA_MAP.set(assetId, newData);
521
+ }
522
+ logError(message) {
523
+ if (!this.debugMode)
524
+ return;
525
+ console.error(`${NativeAudioWeb.LOG_TAG} Error: ${message}`);
526
+ }
527
+ logWarning(message) {
528
+ if (!this.debugMode)
529
+ return;
530
+ console.warn(`${NativeAudioWeb.LOG_TAG} Warning: ${message}`);
531
+ }
532
+ logInfo(message) {
533
+ if (!this.debugMode)
534
+ return;
535
+ console.info(`${NativeAudioWeb.LOG_TAG} Info: ${message}`);
536
+ }
537
+ logDebug(message) {
538
+ if (!this.debugMode)
539
+ return;
540
+ console.debug(`${NativeAudioWeb.LOG_TAG} Debug: ${message}`);
541
+ }
542
+ async getPluginVersion() {
543
+ return { version: 'web' };
544
+ }
545
+ async deinitPlugin() {
546
+ for (const [assetId] of NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID) {
547
+ await this.unload({ assetId });
548
+ }
549
+ this.stopCurrentTimeUpdates();
550
+ }
551
+ }
552
+ NativeAudioWeb.LOG_TAG = '[NativeAudioWeb]';
553
+ NativeAudioWeb.FILE_LOCATION = '';
554
+ NativeAudioWeb.DEFAULT_FADE_DURATION_SEC = 1;
555
+ NativeAudioWeb.CURRENT_TIME_UPDATE_INTERVAL = 100;
556
+ NativeAudioWeb.AUDIO_PRELOAD_OPTIONS_MAP = new Map();
557
+ NativeAudioWeb.AUDIO_DATA_MAP = new Map();
558
+ NativeAudioWeb.AUDIO_ASSET_BY_ASSET_ID = new Map();
559
+ NativeAudioWeb.AUDIO_CONTEXT_MAP = new Map();
560
+ NativeAudioWeb.MEDIA_ELEMENT_SOURCE_MAP = new Map();
561
+ NativeAudioWeb.GAIN_NODE_MAP = new Map();
562
+ NativeAudioWeb.playOnceAssets = new Set();
563
+ new NativeAudioWeb();
564
+
565
+ var web = /*#__PURE__*/Object.freeze({
566
+ __proto__: null,
567
+ NativeAudioWeb: NativeAudioWeb
568
+ });
569
+
570
+ exports.NativeAudio = NativeAudio;
571
+ //# sourceMappingURL=plugin.cjs.js.map