Реагировать родной звук остановить все звуки
Я хочу воспроизводить длинные аудиофайлы из списка, файлы загружаются при первом нажатии, все последующие нажатия воспроизводят аудио. Но проблема в том, что при воспроизведении одного файла, а я нажимаю на другой, первый все еще воспроизводится, а следующий - тоже. Есть ли способ остановить все воспроизводимые в данный момент файлы, когда я нажимаю на любой элемент списка?
onPressHandler = (file, title) => {
let name = file.substring(file.lastIndexOf("/") + 1);
RNFetchBlob.fs.exists(`/storage/sdcard0/Android/data/com.myapp/files/Download/${name}.mp3`)
.then((exist) => {
if (exist) {
/* I want to stop all playing audios here */
var whoosh = new Sound(`/storage/sdcard0/Android/data/com.myapp/files/Download/${name}.mp3`, '', (error) => {
if (error) {
alert('failed to load the sound', error);
return;
}
alert('duration in seconds: ' + whoosh.getDuration() + 'number of channels: ' + whoosh.getNumberOfChannels());
alert(whoosh.isLoaded());
whoosh.play((success) => {
if (success) {
alert('successfully finished playing');
} else {
alert('playback failed due to audio decoding errors');
whoosh.reset();
}
});
});
} else {
const url = `http://myresourcesite/${file}.mp3`;
const headers = {};
const config = {
downloadTitle: name,
downloadDescription: 'Downloading ...',
saveAsName: `${name}.mp3`,
allowedInRoaming: true,
allowedInMetered: true,
showInDownloads: true
};
downloadManager.download(url, headers, config).then((response) => {
alert('Download success!');
}).catch(err => {
alert('Download failed!');
});
}
})
.catch(() => {
alert('error has occured');
});
}
2 ответа
Я не думаю, что есть функция stopAll(). Вы должны отслеживать экземпляры, которые вы создаете. Я использую одну глобальную переменную. С некоторой логикой я могу убедиться, что одновременно воспроизводится только один звук.
- Когда вы создаете новый звуковой объект, присвойте ему глобальную переменную.
- Прежде чем создавать новый звуковой объект, остановите звук на глобальном экземпляре
- Добавить нулевую проверку глобальной переменной для первого клика
var whoosh = new Sound(`/storage/sdcard0/Android/data/com.myapp/files/Download/${name}.mp3`, '', (error) => {
if (error) {
alert('failed to load the sound', error);
return;
}
if (global.sound) global.sound.stop();
global.sound = whoosh;
whoosh.play( success => { console.log('Playing') } );
}
Люди считают глобальные переменные плохими в JS. Если вы неправильно используете да. Но в данном случае это действительно глобальный объект, и в этом нет ничего плохого. Это не злоупотребление.
Как вы описываете, я думаю, вам нужно воспроизводить только один звук за раз. Возможно, вы можете проверить, является ли playerPlaying().
mySound = null;
PlayLocalSoundFile = (nombreSonido) => {
if(this.mySound != null){
if(this.mySound.isPlaying()){
this.mySound.stop();//Lo detiene si hay otro tocando
}
}
Sound.setCategory('Playback');
this.mySound = new Sound('./' + nombreSonido, Sound.MAIN_BUNDLE, (error) => {
if (error) {
console.log('Error loading sound: ' + error);
return;
} else {
this.mySound.play((success) => {
if (success) {
console.log('End playing ' + nombreSonido)
} else {
console.log('Issue playing file' + nombreSonido);
}
})
}
});
this.mySound.setVolume(0.9);
this.mySound.release();
}