[MP3 SHIELD] Interruption d'un son

Salut !

Je voudrais pouvoir jouer en boucle un son et l'arrêter à tout moment pour jouer un autre petit son temporaire. Et le son en boucle reprend après.

Pour l'instant, mon son est en boucle, mais je ne peux que jouer mon second son lorsque le premier est terminé ...

Avez-vous une idée ?

/*************************************************** 
  This is an example for the Adafruit VS1053 Codec Breakout

  Designed specifically to work with the Adafruit VS1053 Codec Breakout 
  ----> https://www.adafruit.com/products/1381

  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

// include SPI, MP3 and SD libraries
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>

// define the pins used
//#define CLK 13       // SPI Clock, shared with SD card
//#define MISO 12      // Input data, from VS1053/SD card
//#define MOSI 11      // Output data, to VS1053/SD card
// Connect CLK, MISO and MOSI to hardware SPI pins. 
// See http://arduino.cc/en/Reference/SPI "Connections"

// These are the pins used for the breakout example
#define BREAKOUT_RESET  9      // VS1053 reset pin (output)
#define BREAKOUT_CS     10     // VS1053 chip select pin (output)
#define BREAKOUT_DCS    8      // VS1053 Data/command select pin (output)
// These are the pins used for the music maker shield
#define SHIELD_RESET  -1      // VS1053 reset pin (unused!)
#define SHIELD_CS     7      // VS1053 chip select pin (output)
#define SHIELD_DCS    6      // VS1053 Data/command select pin (output)

// These are common pins between breakout and shield
#define CARDCS 4     // Card chip select pin
// DREQ should be an Int pin, see http://arduino.cc/en/Reference/attachInterrupt
#define DREQ 3       // VS1053 Data request, ideally an Interrupt pin

Adafruit_VS1053_FilePlayer musicPlayer = 
  // create breakout-example object!
  //Adafruit_VS1053_FilePlayer(BREAKOUT_RESET, BREAKOUT_CS, BREAKOUT_DCS, DREQ, CARDCS);
  // create shield-example object!
  Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
  
void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit VS1053 Simple Test");

  if (! musicPlayer.begin()) { // initialise the music player
     Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
     while (1);
  }
  Serial.println(F("VS1053 found"));
  
   if (!SD.begin(CARDCS)) {
    Serial.println(F("SD failed, or not present"));
    while (1);  // don't do anything more
  }

  // list files
  printDirectory(SD.open("/"), 0);
  
  // Set volume for left, right channels. lower numbers == louder volume!
  musicPlayer.setVolume(50,50);

  // Timer interrupts are not suggested, better to use DREQ interrupt!
  //musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT); // timer int

  // If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background
  // audio playing
  musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT);  // DREQ int
  
  
}

void loop() {
  // File is playing in the background
  if (musicPlayer.stopped()) {
    Serial.println("Done playing music");
    musicPlayer.startPlayingFile("track001.wav");
  }
  if (Serial.available()) {
    char c = Serial.read();
    
    // if we get an 's' on the serial console, stop!
    if (c == 's') {
      musicPlayer.stopPlaying();
      musicPlayer.startPlayingFile("track002.wav");
    }
    
    // if we get an 'p' on the serial console, pause/unpause!
    if (c == 'p') {
      if (! musicPlayer.paused()) {
        Serial.println("Paused");
        musicPlayer.pausePlaying(true);
      } else { 
        Serial.println("Resumed");
        musicPlayer.pausePlaying(false);
      }
    }
  }

  delay(100);
}


/// File listing helper
void printDirectory(File dir, int numTabs) {
   while(true) {
     
     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       //Serial.println("**nomorefiles**");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
       // files have sizes, directories do not
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
     entry.close();
   }
}

Qu’avez vous essayé? vous comprenez le code posté?

J'ai essayé le code posté...

Oui et non, le code posté est repris d'un exemple de la lib VS1053 que j'ai modifié...

Je comprend que startPlayingFile() permet de lire le fichier en interruption et de continuer à exécuter des tâches mais mon son ne s'arrête pas lorsque j'envoi le caractère 's'... le son doit se terminer pour exécuter la suite.

Qu'est ce qui m'échappe ?

Quand vous envoyez s ça fait (si le port série est configuré correctement et que vous n’envoyez pas aussi LF et/ou CR )

if (c == 's') {
      musicPlayer.stopPlaying();
      musicPlayer.startPlayingFile("track002.wav");
    }

Mais ensuite vous tombez dans le else final. Vous manque un else dans doute non? :slight_smile:

Je n'ai pas besoins de else. Si je ne reçois pas le caractère 's' alors fait rien et passe à la suite du programme...

Ma réception fonctionne puisque mon 2ème son se mets en marche mais seulement quand le 1er son est terminé.

Bon ok j'ai trouvé...

L'interruption ne marche pas avec un .wav. J'ai mis un MP3 et le programme continu bien à exécuter la suite des instructions :neutral_face:

Simlock:
Je n'ai pas besoins de else. Si je ne reçois pas le caractère 's' alors fait rien et passe à la suite du programme...

oui mais vous testez le 'p' même si vous avez reçu le 's'

bizarre sur le wav versus mp3!