react-native-audio-api
Version:
react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification
116 lines (114 loc) • 3.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getSourceHeaders = getSourceHeaders;
exports.resolveSourcePath = resolveSourcePath;
exports.useStableAudioProps = useStableAudioProps;
exports.withPropsDefaults = withPropsDefaults;
var _react = require("react");
var _reactNative = require("react-native");
var _AudioContext = _interopRequireDefault(require("../core/AudioContext"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const noop = () => {};
const noopError = _error => {};
const noopNumber = _number => {};
/**
* Merge props with defaults. `resolvedContext` must be stable when using the
* implicit default (see `useStableAudioProps` — one `AudioContext` per hook
* mount).
*/
function withPropsDefaults(props, resolvedContext) {
return {
...props,
autoPlay: props.autoPlay ?? false,
controls: props.controls ?? false,
loop: props.loop ?? false,
muted: props.muted ?? false,
preload: props.preload || 'auto',
forceDownload: props.forceDownload ?? false,
source: props.source ?? [],
playbackRate: props.playbackRate ?? 1.0,
preservesPitch: props.preservesPitch ?? true,
volume: props.volume ?? 1.0,
context: resolvedContext,
onLoadStart: props.onLoadStart ?? noop,
onLoad: props.onLoad ?? noop,
onError: props.onError ?? noopError,
onPositionChange: props.onPositionChange ?? noopNumber,
onEnded: props.onEnded ?? noop,
onPlay: props.onPlay ?? noop,
onPause: props.onPause ?? noop,
onVolumeChange: props.onVolumeChange ?? noopNumber
};
}
function useStableAudioProps(props) {
const resolvedContext = (0, _react.useMemo)(() => {
if (_reactNative.Platform.OS === 'web') {
return undefined;
}
return props.context ?? new _AudioContext.default();
}, [props.context]);
const {
// Control Props
autoPlay,
controls,
loop,
muted,
preload,
forceDownload,
source,
playbackRate,
preservesPitch,
volume,
context,
// Event Props
onLoadStart,
onLoad,
onError,
onPositionChange,
onEnded,
onPlay,
onPause,
onVolumeChange
} = withPropsDefaults(props, resolvedContext);
return (0, _react.useMemo)(() => ({
// Control Props
autoPlay,
controls,
loop,
muted,
preload,
forceDownload,
source,
playbackRate,
preservesPitch,
volume,
context,
// Event Props
onLoadStart,
onLoad,
onError,
onPositionChange,
onEnded,
onPlay,
onPause,
onVolumeChange
}), [autoPlay, controls, loop, muted, preload, forceDownload, source, playbackRate, preservesPitch, volume, context, onLoadStart, onLoad, onError, onPositionChange, onEnded, onPlay, onPause, onVolumeChange]);
}
function resolveSourcePath(source) {
if (typeof source === 'string') {
return source;
}
if (typeof source === 'number') {
return _reactNative.Image.resolveAssetSource(source).uri;
}
return source.uri ?? '';
}
function getSourceHeaders(source) {
if (typeof source === 'object' && source && 'headers' in source) {
return source.headers;
}
return undefined;
}
//# sourceMappingURL=utils.js.map