import type { PluginListenerHandle } from '@capacitor/core'; export interface CompletedEvent { /** * Emit when a play completes * * @since 5.0.0 */ assetId: string; } export type CompletedListener = (state: CompletedEvent) => void; export interface Assets { /** * Asset Id, unique identifier of the file */ assetId: string; } export interface AssetVolume { /** * Asset Id, unique identifier of the file */ assetId: string; /** * Volume of the audio, between 0.1 and 1.0 */ volume: number; /** * Time over which to fade to the target volume, in seconds. Default is 0s (immediate). */ duration?: number; } export interface AssetRate { /** * Asset Id, unique identifier of the file */ assetId: string; /** * Rate of the audio, between 0.1 and 1.0 */ rate: number; } export interface AssetSetTime { /** * Asset Id, unique identifier of the file */ assetId: string; /** * Time to set the audio, in seconds */ time: number; } export interface AssetPlayOptions { /** * Asset Id, unique identifier of the file */ assetId: string; /** * Time to start playing the audio, in seconds */ time?: number; /** * Delay to start playing the audio, in seconds */ delay?: number; /** * Volume of the audio, between 0.1 and 1.0 */ volume?: number; /** * Whether to fade in the audio */ fadeIn?: boolean; /** * Whether to fade out the audio */ fadeOut?: boolean; /** * Fade in duration in seconds. * Only used if fadeIn is true. * Default is 1s. */ fadeInDuration?: number; /** * Fade out duration in seconds. * Only used if fadeOut is true. * Default is 1s. */ fadeOutDuration?: number; /** * Time in seconds from the start of the audio to start fading out. * Only used if fadeOut is true. * Default is fadeOutDuration before end of audio. */ fadeOutStartTime?: number; } export interface AssetStopOptions { /** * Asset Id, unique identifier of the file */ assetId: string; /** * Whether to fade out the audio before stopping */ fadeOut?: boolean; /** * Fade out duration in seconds. * Default is 1s. */ fadeOutDuration?: number; } export interface AssetPauseOptions { /** * Asset Id, unique identifier of the file */ assetId: string; /** * Whether to fade out the audio before pausing */ fadeOut?: boolean; /** * Fade out duration in seconds. * Default is 1s. */ fadeOutDuration?: number; } export interface AssetResumeOptions { /** * Asset Id, unique identifier of the file */ assetId: string; /** * Whether to fade in the audio during resume */ fadeIn?: boolean; /** * Fade in duration in seconds. * Default is 1s. */ fadeInDuration?: number; } export interface ConfigureOptions { /** * focus the audio with Audio Focus */ focus?: boolean; /** * Play the audio in the background */ background?: boolean; /** * Ignore silent mode, works only on iOS setting this will nuke other audio apps */ ignoreSilent?: boolean; /** * Show audio playback in the notification center (iOS and Android) * When enabled, displays audio metadata (title, artist, album, artwork) in the system notification * and Control Center (iOS) or lock screen. * * **Important iOS Behavior:** * Enabling this option changes the audio session category to `.playback` with `.default` mode, * which means your app's audio will **interrupt** other apps' audio (like background music from * Spotify, Apple Music, etc.) instead of mixing with it. This is required for the Now Playing * info to appear in Control Center and on the lock screen. * * **Trade-offs:** * - `showNotification: true` → Shows Now Playing controls, but interrupts other audio * - `showNotification: false` → Audio mixes with other apps, but no Now Playing controls * * Use this when your app is the primary audio source (music players, podcast apps, etc.). * Disable this for secondary audio like sound effects or notification sounds where mixing * with background music is preferred. * * @see https://github.com/Cap-go/capacitor-native-audio/issues/202 */ showNotification?: boolean; /** * Enable background audio playback (Android only) * * When enabled, audio will continue playing when the app is backgrounded or the screen is locked. * The plugin will skip the automatic pause/resume logic that normally occurs when the app * enters the background or returns to the foreground. * * **Important Android Requirements:** * To use background playback on Android, your app must: * 1. Declare the required permissions in `AndroidManifest.xml`: * - `` * - `` * - `` * 2. Start a Foreground Service with a media-style notification before backgrounding * (the plugin does not automatically create or manage the foreground service) * 3. Use `showNotification: true` to display playback controls in the notification * * **Usage Example:** * ```typescript * await NativeAudio.configure({ * backgroundPlayback: true, * showNotification: true * }); * // Start your foreground service here * // Then preload and play audio as normal * ``` * * @default false * @platform Android * @since 8.2.0 */ backgroundPlayback?: boolean; } /** * Metadata to display in the notification center, Control Center (iOS), and lock screen * when `showNotification` is enabled in `configure()`. * * Note: This metadata will only be displayed if `showNotification: true` is set in the * `configure()` method. See {@link ConfigureOptions.showNotification} for important * behavior details about audio mixing on iOS. */ export interface NotificationMetadata { /** * The title to display in the notification center */ title?: string; /** * The artist name to display in the notification center */ artist?: string; /** * The album name to display in the notification center */ album?: string; /** * URL or local path to the artwork/album art image */ artworkUrl?: string; } export interface PlayOnceOptions { /** * Path to the audio file, relative path of the file, absolute url (file://) or remote url (https://) * Supported formats: * - MP3, WAV (all platforms) * - M3U8/HLS streams (iOS and Android) */ assetPath: string; /** * Volume of the audio, between 0.1 and 1.0 * @default 1.0 */ volume?: number; /** * Is the audio file a URL, pass true if assetPath is a `file://` url * or a streaming URL (m3u8) * @default false */ isUrl?: boolean; /** * Automatically start playback after loading * @default true */ autoPlay?: boolean; /** * Delete the audio file from disk after playback completes * Only works for local files (file:// URLs), ignored for remote URLs * @default false * @since 7.11.0 */ deleteAfterPlay?: boolean; /** * Metadata to display in the notification center when audio is playing. * Only used when `showNotification: true` is set in `configure()`. * * See {@link ConfigureOptions.showNotification} for important details about * how this affects audio mixing behavior on iOS. * * @see NotificationMetadata * @since 7.10.0 */ notificationMetadata?: NotificationMetadata; /** * Custom HTTP headers to include when fetching remote audio files. * Only used when isUrl is true and assetPath is a remote URL (http/https). * Example: { 'x-api-key': 'abc123', 'Authorization': 'Bearer token' } * * @since 7.10.0 */ headers?: Record; } export interface PlayOnceResult { /** * The internally generated asset ID for this playback * Can be used to control playback (pause, stop, etc.) before completion */ assetId: string; } export interface PreloadOptions { /** * Path to the audio file, relative path of the file, absolute url (file://) or remote url (https://) * Supported formats: * - MP3, WAV (all platforms) * - M3U8/HLS streams (iOS and Android) */ assetPath: string; /** * Asset Id, unique identifier of the file */ assetId: string; /** * Volume of the audio, between 0.1 and 1.0 */ volume?: number; /** * Audio channel number, default is 1 */ audioChannelNum?: number; /** * Is the audio file a URL, pass true if assetPath is a `file://` url * or a streaming URL (m3u8) */ isUrl?: boolean; /** * Metadata to display in the notification center when audio is playing. * Only used when `showNotification: true` is set in `configure()`. * * See {@link ConfigureOptions.showNotification} for important details about * how this affects audio mixing behavior on iOS. * * @see NotificationMetadata */ notificationMetadata?: NotificationMetadata; /** * Custom HTTP headers to include when fetching remote audio files. * Only used when isUrl is true and assetPath is a remote URL (http/https). * Example: { 'x-api-key': 'abc123', 'Authorization': 'Bearer token' } * * @since 7.10.0 */ headers?: Record; } export interface CurrentTimeEvent { /** * Current time of the audio in seconds * @since 6.5.0 */ currentTime: number; /** * Asset Id of the audio * @since 6.5.0 */ assetId: string; } export type CurrentTimeListener = (state: CurrentTimeEvent) => void; export type PlaybackStateValue = 'playing' | 'paused' | 'stopped'; export interface PlaybackStateEvent { /** * Asset Id of the audio */ assetId: string; /** * Resolved playback state after a local or remote transport action. */ state: PlaybackStateValue; /** * Reason for the state change, for example `play`, `pause`, `remotePlay`, or `complete`. */ reason: string; /** * Whether the asset is currently playing. */ isPlaying: boolean; /** * Current playback position in seconds when available. */ currentTime?: number; /** * Total playback duration in seconds when available. */ duration?: number; } export type PlaybackStateListener = (state: PlaybackStateEvent) => void; export interface NativeAudio { /** * Configure the audio player * @since 5.0.0 * @param option {@link ConfigureOptions} * @returns */ configure(options: ConfigureOptions): Promise; /** * Load an audio file * @since 5.0.0 * @param option {@link PreloadOptions} * @returns */ preload(options: PreloadOptions): Promise; /** * Play an audio file once with automatic cleanup * * Method designed for simple, single-shot audio playback, * such as notification sounds, UI feedback, or other short audio clips * that don't require manual state management. * * **Key Features:** * - **Fire-and-forget**: No need to manually preload, play, stop, or unload * - **Auto-cleanup**: Asset is automatically unloaded after playback completes * - **Optional file deletion**: Can delete local files after playback (useful for temp files) * - **Returns assetId**: Can still control playback if needed (pause, stop, etc.) * * **Use Cases:** * - Notification sounds * - UI sound effects (button clicks, alerts) * - Short audio clips that play once * - Temporary audio files that should be cleaned up * * **Comparison with regular play():** * - `play()`: Requires manual preload, play, and unload steps * - `playOnce()`: Handles everything automatically with a single call * * @example * ```typescript * // Simple one-shot playback * await NativeAudio.playOnce({ assetPath: 'audio/notification.mp3' }); * * // Play and delete the file after completion * await NativeAudio.playOnce({ * assetPath: 'file:///path/to/temp/audio.mp3', * isUrl: true, * deleteAfterPlay: true * }); * * // Get the assetId to control playback * const { assetId } = await NativeAudio.playOnce({ * assetPath: 'audio/long-track.mp3', * autoPlay: true * }); * // Later, you can stop it manually if needed * await NativeAudio.stop({ assetId }); * ``` * * @since 7.11.0 * @param options {@link PlayOnceOptions} * @returns {Promise} Object containing the generated assetId */ playOnce(options: PlayOnceOptions): Promise; /** * Check if an audio file is preloaded * * @since 6.1.0 * @param option {@link Assets} * @returns {Promise} */ isPreloaded(options: PreloadOptions): Promise<{ found: boolean; }>; /** * Play an audio file * @since 5.0.0 * @param option {@link AssetPlayOptions} * @returns */ play(options: AssetPlayOptions): Promise; /** * Pause an audio file * @since 5.0.0 * @param option {@link AssetPauseOptions} * @returns */ pause(options: AssetPauseOptions): Promise; /** * Resume an audio file * @since 5.0.0 * @param option {@link AssetResumeOptions} * @returns */ resume(options: AssetResumeOptions): Promise; /** * Stop an audio file * @since 5.0.0 * @param option {@link Assets} * @returns */ loop(options: Assets): Promise; /** * Stop an audio file * @since 5.0.0 * @param option {@link AssetStopOptions} * @returns */ stop(options: AssetStopOptions): Promise; /** * Unload an audio file * @since 5.0.0 * @param option {@link Assets} * @returns */ unload(options: Assets): Promise; /** * Set the volume of an audio file * @since 5.0.0 * @param option {@link AssetVolume} * @returns {Promise} */ setVolume(options: AssetVolume): Promise; /** * Set the rate of an audio file * @since 5.0.0 * @param option {@link AssetRate} * @returns {Promise} */ setRate(options: AssetRate): Promise; /** * Set the current time of an audio file * @since 6.5.0 * @param option {@link AssetSetTime} * @returns {Promise} */ setCurrentTime(options: AssetSetTime): Promise; /** * Get the current time of an audio file * @since 5.0.0 * @param option {@link Assets} * @returns {Promise<{ currentTime: number }>} */ getCurrentTime(options: Assets): Promise<{ currentTime: number; }>; /** * Get the duration of an audio file in seconds * @since 5.0.0 * @param option {@link Assets} * @returns {Promise<{ duration: number }>} */ getDuration(options: Assets): Promise<{ duration: number; }>; /** * Check if an audio file is playing * * @since 5.0.0 * @param option {@link Assets} * @returns {Promise} */ isPlaying(options: Assets): Promise<{ isPlaying: boolean; }>; /** * Listen for complete event * * @since 5.0.0 * return {@link CompletedEvent} */ addListener(eventName: 'complete', listenerFunc: CompletedListener): Promise; /** * Listen for current time updates * Emits every 100ms while audio is playing * * @since 6.5.0 * return {@link CurrentTimeEvent} */ addListener(eventName: 'currentTime', listenerFunc: CurrentTimeListener): Promise; /** * Listen for playback state changes, including notification and lock-screen transport controls. * Emitted by Android and iOS. The current Web implementation does not emit this event. * * @since 8.3.15 * return {@link PlaybackStateEvent} */ addListener(eventName: 'playbackState', listenerFunc: PlaybackStateListener): Promise; /** * Clear the audio cache for remote audio files * @since 6.5.0 * @returns {Promise} */ clearCache(): Promise; /** * Set debug mode logging * @since 6.5.0 * @param options - Options to enable or disable debug mode */ setDebugMode(options: { enabled: boolean; }): Promise; /** * Get the native Capacitor plugin version * * @returns {Promise<{ id: string }>} an Promise with version for this device * @throws An error if the something went wrong */ getPluginVersion(): Promise<{ version: string; }>; /** * Deinitialize the plugin and restore original audio session settings * This method stops all playing audio and reverts any audio session changes made by the plugin * Use this when you need to ensure compatibility with other audio plugins * * @since 7.7.0 * @returns {Promise} */ deinitPlugin(): Promise; }