I am using Expo Audio to play some short sounds from a list.
async playAudio(file) {
try {
await Audio.setIsEnabledAsync(true);
const sound = new Audio.Sound();
await sound.loadAsync(file);
await sound.playAsync();
} catch(error) {
console.error(error);
}
}
Which I'm calling from a list rendered with list.map()
renderTheList = (item, i) => {
return (
<View key={i}>
<TouchableOpacity onPress={ () => { this.onAudioSelected(item.audio) }}>
</TouchableOpacity>
</View>
)
}
onAudioSelected(audio) {
// Audio.clearSounds() <-- something like this
playAudio(audio)
...
}
The sounds play fine, but when I select the next item in the list, the previous sound does not stop. So if I touch a bunch in a row, a bunch of sounds play at once.
How can I stop all currently playing sounds?
I figured out that I should create the playback object in the constructor and use unloadAsync()
constructor(props)
{
super(props);
this.audioPlayer = new Audio.Sound();
}
playSound = async () => {
try {
await this.audioPlayer.unloadAsync()
await this.audioPlayer.loadAsync(require("../soundfile.mp3"));
await this.audioPlayer.playAsync();
} catch (err) {
console.warn("Couldn't Play audio", err)
}
}
The full documentation is found at AV - Expo Documentation
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With