Реагировать родной звук остановить все звуки

Я хочу воспроизводить длинные аудиофайлы из списка, файлы загружаются при первом нажатии, все последующие нажатия воспроизводят аудио. Но проблема в том, что при воспроизведении одного файла, а я нажимаю на другой, первый все еще воспроизводится, а следующий - тоже. Есть ли способ остановить все воспроизводимые в данный момент файлы, когда я нажимаю на любой элемент списка?

 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();
  }
Другие вопросы по тегам