xref: /expo/home/utils/useAudio.ts (revision fd588f0d)
1import { Audio, AudioMode, InterruptionModeAndroid } from 'expo-av';
2import { Dispatch, useEffect, useState } from 'react';
3
4export function useAudio(): [boolean, Dispatch<boolean>] {
5  const [isAudioEnabled, setAudioEnabled] = useState(true);
6
7  useEffect(() => {
8    Audio.setIsEnabledAsync(isAudioEnabled);
9    return () => {
10      Audio.setIsEnabledAsync(true);
11    };
12  }, [isAudioEnabled]);
13
14  return [isAudioEnabled, setAudioEnabled];
15}
16
17export function useAudioMode(
18  initialAudioMode: Partial<AudioMode>
19): [Partial<AudioMode>, Dispatch<Partial<AudioMode>>] {
20  const [audioMode, setAudioMode] = useState(initialAudioMode);
21
22  useEffect(() => {
23    setAudioModeAsync(audioMode);
24  }, [audioMode]);
25
26  return [audioMode, setAudioMode];
27}
28
29async function setAudioModeAsync(audioMode: Partial<AudioMode>): Promise<void> {
30  await Audio.setAudioModeAsync({
31    ...audioMode,
32    interruptionModeAndroid: InterruptionModeAndroid.DoNotMix,
33    shouldDuckAndroid: false,
34    playThroughEarpieceAndroid: false,
35  });
36}
37