Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/mediagrid/capacitor-native-audio

Play audio in a Capacitor app natively from a URL/web source simultaneously with background audio and background play support.
https://github.com/mediagrid/capacitor-native-audio

android audio audio-player capacitor capacitor-android capacitor-ios capacitor-plugin ios

Last synced: 28 days ago
JSON representation

Play audio in a Capacitor app natively from a URL/web source simultaneously with background audio and background play support.

Awesome Lists containing this project

README

        

# @mediagrid/capacitor-native-audio

## Description

Play audio in a Capacitor app natively (Android/iOS) from a URL/web source simultaneously with background audio. Also supports background playing with an OS notification.

## Install

```bash
npm install @mediagrid/capacitor-native-audio
npx cap sync
```

## Android

### `AndroidManifest.xml` required changes

Located at `android/app/src/main/AndroidManifest.xml`

```xml






```

### `strings.xml` required changes

Located at `android/app/src/main/res/values/strings.xml`

```xml


Allows for audio to play in the background.

```

# iOS

## Enable Audio Background Mode

This can be done in XCode or by editing `Info.plist` directly.

```xml

UIBackgroundModes

audio

```

## Add Now Playing Icon (optional) - DEPRECATED

⚠️⚠️ This is DEPRECATED. Use `artworkSource` now. ⚠️⚠️

If you would like a now playing icon to show in the iOS notification, add an image with the name `NowPlayingIcon` to your Asset catalog. See [Managing assets with asset catalogs](https://developer.apple.com/documentation/xcode/managing-assets-with-asset-catalogs) on how to add a new asset.

A PNG is recommended with the size of 1024 x 1024px. The same image can be used for the three different Asset wells (1x, 2x, 3x).

# API

* [`create(...)`](#create)
* [`initialize(...)`](#initialize)
* [`changeAudioSource(...)`](#changeaudiosource)
* [`changeMetadata(...)`](#changemetadata)
* [`getDuration(...)`](#getduration)
* [`getCurrentTime(...)`](#getcurrenttime)
* [`play(...)`](#play)
* [`pause(...)`](#pause)
* [`seek(...)`](#seek)
* [`stop(...)`](#stop)
* [`setVolume(...)`](#setvolume)
* [`setRate(...)`](#setrate)
* [`isPlaying(...)`](#isplaying)
* [`destroy(...)`](#destroy)
* [`onAppGainsFocus(...)`](#onappgainsfocus)
* [`onAppLosesFocus(...)`](#onapplosesfocus)
* [`onAudioReady(...)`](#onaudioready)
* [`onAudioEnd(...)`](#onaudioend)
* [`onPlaybackStatusChange(...)`](#onplaybackstatuschange)
* [Interfaces](#interfaces)

### create(...)

```typescript
create(params: AudioPlayerPrepareParams) => Promise<{ success: boolean; }>
```

Create an audio source to be played.

| Param | Type |
| ------------ | ----------------------------------------------------------------------------- |
| **`params`** | AudioPlayerPrepareParams |

**Returns:** Promise<{ success: boolean; }>

**Since:** 1.0.0

--------------------

### initialize(...)

```typescript
initialize(params: AudioPlayerDefaultParams) => Promise<{ success: boolean; }>
```

Initialize the audio source. Prepares the audio to be played, buffers and such.

Should be called after callbacks are registered (e.g. `onAudioReady`).

| Param | Type |
| ------------ | ----------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams |

**Returns:** Promise<{ success: boolean; }>

**Since:** 1.0.0

--------------------

### changeAudioSource(...)

```typescript
changeAudioSource(params: AudioPlayerDefaultParams & { source: string; }) => Promise
```

Change the audio source on an existing audio source (`audioId`).

This is useful for changing background music while the primary audio is playing
or changing the primary audio before it is playing to accommodate different durations
that a user can choose from.

| Param | Type |
| ------------ | --------------------------------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams & { source: string; } |

**Since:** 1.0.0

--------------------

### changeMetadata(...)

```typescript
changeMetadata(params: AudioPlayerDefaultParams & { friendlyTitle?: string; artworkSource?: string; }) => Promise
```

Change the associated metadata of an existing audio source

| Param | Type |
| ------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams & { friendlyTitle?: string; artworkSource?: string; } |

**Since:** 1.1.0

--------------------

### getDuration(...)

```typescript
getDuration(params: AudioPlayerDefaultParams) => Promise<{ duration: number; }>
```

Get the duration of the audio source.

Should be called once the audio is ready (`onAudioReady`).

| Param | Type |
| ------------ | ----------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams |

**Returns:** Promise<{ duration: number; }>

**Since:** 1.0.0

--------------------

### getCurrentTime(...)

```typescript
getCurrentTime(params: AudioPlayerDefaultParams) => Promise<{ currentTime: number; }>
```

Get the current time of the audio source being played.

| Param | Type |
| ------------ | ----------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams |

**Returns:** Promise<{ currentTime: number; }>

**Since:** 1.0.0

--------------------

### play(...)

```typescript
play(params: AudioPlayerDefaultParams) => Promise
```

Play the audio source.

| Param | Type |
| ------------ | ----------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams |

**Since:** 1.0.0

--------------------

### pause(...)

```typescript
pause(params: AudioPlayerDefaultParams) => Promise
```

Pause the audio source.

| Param | Type |
| ------------ | ----------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams |

**Since:** 1.0.0

--------------------

### seek(...)

```typescript
seek(params: AudioPlayerDefaultParams & { timeInSeconds: number; }) => Promise
```

Seek the audio source to a specific time.

| Param | Type |
| ------------ | ---------------------------------------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams & { timeInSeconds: number; } |

**Since:** 1.0.0

--------------------

### stop(...)

```typescript
stop(params: AudioPlayerDefaultParams) => Promise
```

Stop playing the audio source and reset the current time to zero.

| Param | Type |
| ------------ | ----------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams |

**Since:** 1.0.0

--------------------

### setVolume(...)

```typescript
setVolume(params: AudioPlayerDefaultParams & { volume: number; }) => Promise
```

Set the volume of the audio source. Should be a decimal less than or equal to `1.00`.

This is useful for background music.

| Param | Type |
| ------------ | --------------------------------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams & { volume: number; } |

**Since:** 1.0.0

--------------------

### setRate(...)

```typescript
setRate(params: AudioPlayerDefaultParams & { rate: number; }) => Promise
```

Set the rate for the audio source to be played at.
Should be a decimal. An example being `1` is normal speed, `0.5` being half the speed and `1.5` being 1.5 times faster.

| Param | Type |
| ------------ | ------------------------------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams & { rate: number; } |

**Since:** 1.0.0

--------------------

### isPlaying(...)

```typescript
isPlaying(params: AudioPlayerDefaultParams) => Promise<{ isPlaying: boolean; }>
```

Wether or not the audio source is currently playing.

| Param | Type |
| ------------ | ----------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams |

**Returns:** Promise<{ isPlaying: boolean; }>

**Since:** 1.0.0

--------------------

### destroy(...)

```typescript
destroy(params: AudioPlayerDefaultParams) => Promise
```

Destroy all resources for the audio source.
The audio source with `useForNotification = true` must be destroyed last.

| Param | Type |
| ------------ | ----------------------------------------------------------------------------- |
| **`params`** | AudioPlayerDefaultParams |

**Since:** 1.0.0

--------------------

### onAppGainsFocus(...)

```typescript
onAppGainsFocus(params: AudioPlayerListenerParams, callback: () => void) => Promise
```

Register a callback for when the app comes to the foreground.

| Param | Type |
| -------------- | ------------------------------------------------------------------------------- |
| **`params`** | AudioPlayerListenerParams |
| **`callback`** | () => void |

**Returns:** Promise<AudioPlayerListenerResult>

**Since:** 1.0.0

--------------------

### onAppLosesFocus(...)

```typescript
onAppLosesFocus(params: AudioPlayerListenerParams, callback: () => void) => Promise
```

Registers a callback from when the app goes to the background.

| Param | Type |
| -------------- | ------------------------------------------------------------------------------- |
| **`params`** | AudioPlayerListenerParams |
| **`callback`** | () => void |

**Returns:** Promise<AudioPlayerListenerResult>

**Since:** 1.0.0

--------------------

### onAudioReady(...)

```typescript
onAudioReady(params: AudioPlayerListenerParams, callback: () => void) => Promise
```

Registers a callback for when the audio source is ready to be played.

| Param | Type |
| -------------- | ------------------------------------------------------------------------------- |
| **`params`** | AudioPlayerListenerParams |
| **`callback`** | () => void |

**Returns:** Promise<AudioPlayerListenerResult>

**Since:** 1.0.0

--------------------

### onAudioEnd(...)

```typescript
onAudioEnd(params: AudioPlayerListenerParams, callback: () => void) => Promise
```

Registers a callback for when the audio source has ended (reached the end of the audio).

| Param | Type |
| -------------- | ------------------------------------------------------------------------------- |
| **`params`** | AudioPlayerListenerParams |
| **`callback`** | () => void |

**Returns:** Promise<AudioPlayerListenerResult>

**Since:** 1.0.0

--------------------

### onPlaybackStatusChange(...)

```typescript
onPlaybackStatusChange(params: AudioPlayerListenerParams, callback: (result: { status: 'playing' | 'paused' | 'stopped'; }) => void) => Promise
```

Registers a callback for when state of playback for the audio source has changed.
This should be used to update the UI when the notification controls are used to control the playback.

| Param | Type |
| -------------- | --------------------------------------------------------------------------------- |
| **`params`** | AudioPlayerListenerParams |
| **`callback`** | (result: { status: 'playing' \| 'paused' \| 'stopped'; }) => void |

**Returns:** Promise<AudioPlayerListenerResult>

**Since:** 1.0.0

--------------------

### Interfaces

#### AudioPlayerPrepareParams

| Prop | Type | Description | Default | Since |
| ------------------------ | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | ----- |
| **`audioSource`** | string | A URI for the audio file to play | | 1.0.0 |
| **`friendlyTitle`** | string | The title/name of the audio file to be used on the notification | | 1.0.0 |
| **`useForNotification`** | boolean | Whether to use this audio file for the notification. This is considered the primary audio to play. It must be created first and you may only have one at a time. | false | 1.0.0 |
| **`artworkSource`** | string | A URI for the album art image to display on the Android/iOS notification. Can also be an in-app source. Pulls from `android/app/src/assets/public` and `ios/App/App/public`. If using [Vite](https://vitejs.dev/guide/assets.html#the-public-directory), you would put the image in your `public` folder and the build process will copy to `dist` which in turn will be copied to the Android/iOS assets by Capacitor. A PNG is the best option with square dimensions. 1200 x 1200px is a good option. | | 1.0.0 |
| **`isBackgroundMusic`** | boolean | Is this audio for background music/audio. Should not be `true` when `useForNotification = true`. | false | 1.0.0 |
| **`loop`** | boolean | Whether or not to loop other audio like background music while the primary audio (`useForNotification = true`) is playing. | false | 1.0.0 |
| **`showSeekBackward`** | boolean | Whether or not to show the seek backward button on the OS's notification. Only has affect when `useForNotification = true`. | true | 1.2.0 |
| **`showSeekForward`** | boolean | Whether or not to show the seek forward button on the OS's notification. Only has affect when `useForNotification = true`. | true | 1.2.0 |

#### AudioPlayerDefaultParams

| Prop | Type | Description | Since |
| ------------- | ------------------- | -------------------------------------------------- | ----- |
| **`audioId`** | string | Any string to differentiate different audio files. | 1.0.0 |

#### AudioPlayerListenerResult

| Prop | Type |
| ---------------- | ------------------- |
| **`callbackId`** | string |

#### AudioPlayerListenerParams

| Prop | Type | Description | Since |
| ------------- | ------------------- | ------------------------------------------- | ----- |
| **`audioId`** | string | The `audioId` set when `create` was called. | 1.0.0 |