react-use-audio-player-guru
Version:
React hook for building custom audio playback controls
206 lines (141 loc) • 6.65 kB
Markdown
# react-use-audio-player
A custom React hook for controlling browser audio powered by the amazing [howler.js](https://howlerjs.com/) library. The intention of this package is to abstract away the details of howler's API using built-in React primitives to create an interface that is more React-friendly, allowing you to write React code that is free from audio-related side-effects.

[](https://app.circleci.com/github/E-Kuerschner/useAudioPlayer/pipelines?branch=master)

## Install
```bash
yarn add react-use-audio-player
```
## TypeScript
For convenience, the library's type definitions are included in the package under `index.d.ts`.
## Usage
This library exports a context Provider and two hooks for controlling an audio source, giving you the tools you need to build you own audio player or visualization.
<br/>
> #### AudioPlayerProvider
This Provider is required for the hooks to function.
The Provider contains a single audio source and exposes an interface for manipulating it via the `useAudioPlayer` hook.
The benefit of having a single, shared audio source is that it allows the developer to compose together multiple components that share knowledge about the audio.
For example, you may have separate components `PlayPauseButton`, `SeekBar` and `VolumeControls` all working together on the same audio source.
```javascript
import React from "react"
import { AudioPlayerProvider } from "react-use-audio-player"
const App = () => {
return (
<AudioPlayerProvider>
<AudioPlayer file="meow.mp3" />
</AudioPlayerProvider>
)
}
```
<br/>
> #### useAudioPlayer
This is the main hook for controlling your audio instance.
Example:
```javascript
import React from "react"
import { useAudioPlayer } from "react-use-audio-player"
const AudioPlayer = ({ file }) => {
const { togglePlayPause, ready, loading, playing } = useAudioPlayer({
src: file,
format: "mp3",
autoplay: false
})
if (!ready && !loading) return <div>No audio to play</div>
if (loading) return <div>Loading audio</div>
return (
<div>
<button onClick={togglePlayPause}>{playing ? "Pause" : "Play"}</button>
</div>
)
}
```
#### API
#### Arguments
`useAudioPlayer` optionally accepts some configuration as its only argument.
The available options closely mirror howler's options but differ in some areas.
- `src: string`
<br/> The path to an audio file
- `format?: string`
<br/> The format of the audio file. The format is infered from the file extension by default.
- `autoplay?: boolean`
<br/> Read more [here](https://github.com/goldfire/howler.js#autoplay-boolean-false)
- `html5?: boolean`
<br/> Read more [here](https://github.com/goldfire/howler.js#html5-boolean-false)
- `xhr?: Object`
<br/> Read more [here](https://github.com/goldfire/howler.js#xhr-object-null)
#### Return Value
`useAudioPlayer` returns a single object containing the following members:
- `load: (config: object) => void`
<br/>method to lazily load audio. It accepts the same configuration object that useAudioPlayer does.
- `loading: boolean`
<br/>true if audio is being fetched
- `ready: boolean`
<br/>true if the audio has been loaded and can be played
- `playing: boolean`
<br/>true is the audio is currently playing
- `stopped: boolean`
<br/>true if the audio has been stopped
- `ended: boolean`
<br/>is true once the currently loaded audio finishes playing. This will be unset if you begin playing again or load a new sound.
- `error: Error`
<br/>set when audio has failed to load
- `play: () => void`
<br/>plays the loaded audio
- `pause: () => void`
<br/>pauses the audio
- `togglePlayPause: () => void`
<br/>convenient equivalent to alternating calls to `play` and `pause`
- `stop: () => void`
<br/>stops the audio, returning the position to 0
- `seek: (position: number) => number | undefined`
<br/>sets the position of the audio to position (seconds)
- `mute: () => void`
<br/>mutes the audio
- `volume: (value: number) => number`
<br/>get/set the volume of the current sound. Volume values between 0.0 and 1.0
<br/>
> #### useAudioPosition
This hooks exposes the current position and duration of the audio instance as its playing in real time.
This data may be useful when animating a visualization for your audio like a seek bar.
A separate hook was created to manage this state in order to avoid many rerenders of components that don't need the live data feed.
For example a component that renders a play/pause button may use `useAudioPlayer` but does not need to rerender every time the position of the playing audio changes.
```javascript
import React from "react"
import { useAudioPosition } from "react-use-audio-player"
const PlayBar = () => {
const { position, duration } = useAudioPosition({ highRefreshRate: true })
const [percent, setPercent] = React.useState(0)
React.useEffect(() => {
setPercent((position / duration) * 100 || 0)
}, [position, duration])
return <ProgressBar percentComplete={percent} />
}
```
#### API
#### Arguments
- `(optional) config: { highRefreshRate: boolean }`
<br/>`highRefreshRate` will allow useAudioPosition to update state at a smooth 60fps rate
via the browser's requestAnimationFrame API. This is ideal for when you want smoother animations.
#### Return Value
`useAudioPosition` returns an object containing the following members:
- `position: number`
<br/>the current playback position of the audio in seconds
- `duration: number`
<br/>the total length of the audio in seconds
- `seek`
<br/> For convenience the `seek` method from useAudioPlayer is also returned from this hook
## Examples
To run the example applications follow the following steps:
1. `git clone` the repository
2. `cd useAudioPlayer/examples`
3. `yarn install`
4. `yarn start`
5. follow the local README for further assistance
## Release
The most basic npm release strategy is being followed for now. A good explanation can be found [here](https://cloudfour.com/thinks/how-to-publish-an-updated-version-of-an-npm-package/).
Steps
1. commit work & tests
2. `yarn/npm version` (preversion script will ensure code is tested and built)
3. `yarn/npm publish`
4. `git push` & `git push --tags`