Forum Rule: Always post complete source code & details to reproduce any issue!
Page 2 of 3 FirstFirst 1 2 3 LastLast
Results 26 to 50 of 52

Thread: problem with 4.0

  1. #26
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    27,678
    This error from msg #16 (edit: and now also msg #24) means you're still missing files that need to be installed on your PC.

    C:\Users\iandi\Documents\Arduino\audio-guestbook-main\audio-guestbook\audio-guestbook.ino:30:24: fatal error: MTP_Teensy.h: No such file or directory
    Hopefully now that you have experienced the way Arduino IDE and Teensy Loader communicate with your Teensy, you can understand this error is not a communication problem with the hardware. It isn't anything at all about the Teensy hardware or the SD card. It is only about files not properly installed on your PC.

    We can try to help you find and install those files.

  2. #27
    i was meaning i cant see the sd card on my computer when i plug the usb into the teensy 4.0 if i take the sd card out plug directly into lappy it fine

  3. #28
    plz do help doing my head in need the files and where to put them thx

  4. #29
    Senior Member BriComp's Avatar
    Join Date
    Apr 2014
    Location
    Cheltenham, UK
    Posts
    1,141
    You can get the MTP files from here.
    Do you know what version of Teensyduino you are running?
    The above code needs Teensyduino vs 1.57 or later.

  5. #30
    Senior Member BriComp's Avatar
    Join Date
    Apr 2014
    Location
    Cheltenham, UK
    Posts
    1,141
    ...as to where to put them...

    Your programs/sketches (whatever you wish to call them) are stored in the directory C:\Users\iandi\Documents\Arduino\.
    Libraries, which is what MTP_Teensy is, are stored in a directory called Libraries within the above directory...so C:\Users\iandi\Documents\Arduino\Libraries\.

    Having downloaded the MTP_Teensy file, you will see that it is a .zip file.

    Fortunately with Windows you can double click on that .zip file and copy thee contents to the Arduino Library directory.

    You can this by above by DOUBLE CLICKING on the MTP_Teensy-main.zip file.
    Now RIGHT CLICK on MTP_Teensy-main and select Copy from the menu.
    Now move to C:\Users\iandi\Documents\Arduino\Libraries\ and RIGHT CLICK on some WHITE SPACE and select Paste from the menu.
    Now the MTP_Teensy library will be in the C:\Users\iandi\Documents\Arduino\Libraries\ directory.

  6. #31
    1.57 and 1.8.19

  7. #32
    Senior Member BriComp's Avatar
    Join Date
    Apr 2014
    Location
    Cheltenham, UK
    Posts
    1,141
    1.57 and 1.8.19
    Ok those should be fine.

  8. #33
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    27,678
    If you find MTP_Teensy inside a "libraries" folder, don't make the mistake of dragging that libraries onto the libraries inside Documents/Arduino. Doing so will result a libraries folder inside the libraries folder. In other words, you would end up with C:\Users\iandi\Documents\Arduino\libraries\librari es\MTP_Teensy. Arduino will get confused, because every folder inside libraries is supposed to be an actual library, not another libraries folder with more libraries folders inside it. The final result should look like C:\Users\iandi\Documents\Arduino\libraries\MTP_Tee nsy.
    Last edited by PaulStoffregen; 02-03-2023 at 04:36 PM. Reason: typo

  9. #34
    Senior Member h4yn0nnym0u5e's Avatar
    Join Date
    Apr 2021
    Location
    Cambridgeshire, UK
    Posts
    630
    So it should look something like this (click on the image to enlarge it...):
    Click image for larger version. 

Name:	MTP-location.png 
Views:	26 
Size:	67.3 KB 
ID:	30298

    I've done some improvements on the documentation, which you can find at https://github.com/h4yn0nnym0u5e/aud...feature/doc-01

    If you want to give that a go, but find anything that still needs further explanation, do come back here and ask. Once it's clear, I'll see if the original author will pull it into his repository to help others in the future!

  10. #35
    getting this message now
    Code:
    Arduino: 1.8.19 (Windows 10), TD: 1.57-beta1, Board: "Teensy 4.0, MTP Disk (Experimental), 600 MHz, Faster, US English"
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook\audio-guestbook.ino:49:1: error: 'AudioPlaySdWavX' does not name a type
    
     AudioPlaySdWavX              playWav1; // Play 44.1kHz 16-bit PCM greeting WAV file
    
     ^
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook\audio-guestbook.ino:54:28: error: 'playWav1' was not declared in this scope
    
     AudioConnection patchCord3(playWav1, 0, mixer, 1); // wav file playback mixer
    
                                ^
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook\audio-guestbook.ino: In function 'void loop()':
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook\audio-guestbook.ino:185:7: error: 'playWav1' was not declared in this scope
    
           playWav1.play("greeting.wav");    
    
           ^
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook\audio-guestbook.ino: In function 'void playAllRecordings()':
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook\audio-guestbook.ino:374:7: error: 'playWav1' was not declared in this scope
    
           playWav1.play(entry.name());
    
           ^
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook\audio-guestbook.ino:380:13: error: 'playWav1' was not declared in this scope
    
         while (!playWav1.isStopped()) { // this works for playWav
    
                 ^
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook\audio-guestbook.ino: In function 'void playLastRecording()':
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook\audio-guestbook.ino:411:7: error: 'playWav1' was not declared in this scope
    
           playWav1.play(filename);
    
           ^
    
    Multiple libraries were found for "SD.h"
    
     Used: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SD
    
     Not used: C:\Program Files (x86)\Arduino\libraries\SD
    
    Error compiling for board Teensy 4.0.
    
    Invalid library found in C:\Users\iandi\Documents\Arduino\libraries\examples: no headers files (.h) found in C:\Users\iandi\Documents\Arduino\libraries\examples
    
    
    
    This report would have more information with
    "Show verbose output during compilation"
    option enabled in File -> Preferences.

  11. #36
    screen shot of directory
    Click image for larger version. 

Name:	Screenshot (1).jpg 
Views:	22 
Size:	54.6 KB 
ID:	30299

  12. #37
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    27,678
    Looks like you copied everything that was inside the original MTP_Teensy folder to the Documents/Arduino/libraries folder. But you should have copied the MTP_Teensy folder (with all of its contents) to Documents/Arduino/libraries.

    To recover, delete all that stuff you copied over. Then try again. Drag the MTP_Teensy folder over, so inside Documents/Arduino/libraries you will see a single MTP_Teensy folder, and inside it has all this stuff.

    Checking your screen against the image in msg #34 might also be a good way to make sure you got it right.

  13. #38
    Senior Member h4yn0nnym0u5e's Avatar
    Join Date
    Apr 2021
    Location
    Cambridgeshire, UK
    Posts
    630
    A few things:
    • please refer to Paul's post and the image I posted to make sure the MTP_Teensy library is in EXACTLY the right path - your image shows that it isn't
    • double-check you have downloaded and not modified the latest code from https://github.com/playfultechnology/audio-guestbook
    • please ensure your unzipped audio-guestbook folder contains ALL the files from the .ZIP you downloaded


    cross-post with Paul!

  14. #39
    like this
    Click image for larger version. 

Name:	Screenshot (3).jpg 
Views:	20 
Size:	46.0 KB 
ID:	30300

  15. #40
    Senior Member BriComp's Avatar
    Join Date
    Apr 2014
    Location
    Cheltenham, UK
    Posts
    1,141
    Oh dear, I have just compiled the copy I downloaded to my PC without any error.
    Do you have this line in your code: #include "play_sd_wav.h" // local copy with fixes?
    I have just commented it out on my copy and get exactly the same error as you are experiencing.
    EDIT:
    The line in question should be around line 31.

    The code below is what the start of my program look like.
    Code:
    /**
     * Audio Guestbook, Copyright (c) 2022 Playful Technology
     * 
     * Tested using a Teensy 4.0 with Teensy Audio Shield, although should work 
     * with minor modifications on other similar hardware
     * 
     * When handset is lifted, a pre-recorded greeting message is played, followed by a tone.
     * Then, recording starts, and continues until the handset is replaced.
     * Playback button allows all messages currently saved on SD card through earpiece 
     * 
     * Files are saved on SD card as 44.1kHz, 16-bit, mono signed integer RAW audio format 
     * --> changed this to WAV recording, DD4WH 2022_07_31
     * --> added MTP support, which enables copying WAV files from the SD card via the USB connection, DD4WH 2022_08_01
     * 
     * 
     * Frank DD4WH, August 1st 2022 
     * for a DBP 611 telephone (closed contact when handheld is lifted) & with recording to WAV file
     * contact for switch button 0 is closed when handheld is lifted
     * 
     * GNU GPL v3.0 license
     * 
     */
    
    #include <Bounce.h>
    #include <Audio.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <SD.h>
    #include <TimeLib.h>
    #include <MTP_Teensy.h>
    #include "play_sd_wav.h" // local copy with fixes

  16. #41
    Senior Member h4yn0nnym0u5e's Avatar
    Join Date
    Apr 2021
    Location
    Cambridgeshire, UK
    Posts
    630
    Probably OK ... hard to tell without seeing the full path to the folder and a glimpse of its contents. It doesn't need the -main on the end, but I think it doesn't hurt, either.

  17. #42
    getting this now moved the files and folders like u said

    Code:
    Arduino: 1.8.19 (Windows 10), TD: 1.57-beta1, Board: "Teensy 4.0, MTP Disk (Experimental), 600 MHz, Faster, US English"
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook-main\audio-guestbook\audio-guestbook.ino:49:1: error: 'AudioPlaySdWavX' does not name a type
    
     AudioPlaySdWavX              playWav1; // Play 44.1kHz 16-bit PCM greeting WAV file
    
     ^
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook-main\audio-guestbook\audio-guestbook.ino:54:28: error: 'playWav1' was not declared in this scope
    
     AudioConnection patchCord3(playWav1, 0, mixer, 1); // wav file playback mixer
    
                                ^
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook-main\audio-guestbook\audio-guestbook.ino: In function 'void loop()':
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook-main\audio-guestbook\audio-guestbook.ino:185:7: error: 'playWav1' was not declared in this scope
    
           playWav1.play("greeting.wav");    
    
           ^
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook-main\audio-guestbook\audio-guestbook.ino: In function 'void playAllRecordings()':
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook-main\audio-guestbook\audio-guestbook.ino:374:7: error: 'playWav1' was not declared in this scope
    
           playWav1.play(entry.name());
    
           ^
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook-main\audio-guestbook\audio-guestbook.ino:380:13: error: 'playWav1' was not declared in this scope
    
         while (!playWav1.isStopped()) { // this works for playWav
    
                 ^
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook-main\audio-guestbook\audio-guestbook.ino: In function 'void playLastRecording()':
    
    C:\Users\iandi\Documents\Arduino\audio-guestbook-main\audio-guestbook\audio-guestbook.ino:411:7: error: 'playWav1' was not declared in this scope
    
           playWav1.play(filename);
    
           ^
    
    Multiple libraries were found for "SD.h"
    
     Used: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SD
    
     Not used: C:\Program Files (x86)\Arduino\libraries\SD
    
    Error compiling for board Teensy 4.0.
    
    
    
    This report would have more information with
    "Show verbose output during compilation"
    option enabled in File -> Preferences.

  18. #43
    Code:
    
    
    Code:
    /**
     * Audio Guestbook, Copyright (c) 2022 Playful Technology
     * 
     * Tested using a Teensy 4.0 with Teensy Audio Shield, although should work 
     * with minor modifications on other similar hardware
     * 
     * When handset is lifted, a pre-recorded greeting message is played, followed by a tone.
     * Then, recording starts, and continues until the handset is replaced.
     * Playback button allows all messages currently saved on SD card through earpiece 
     * 
     * Files are saved on SD card as 44.1kHz, 16-bit, mono signed integer RAW audio format 
     * --> changed this to WAV recording, DD4WH 2022_07_31
     * --> added MTP support, which enables copying WAV files from the SD card via the USB connection, DD4WH 2022_08_01
     * 
     * 
     * Frank DD4WH, August 1st 2022 
     * for a DBP 611 telephone (closed contact when handheld is lifted) & with recording to WAV file
     * contact for switch button 0 is closed when handheld is lifted
     * 
     * GNU GPL v3.0 license
     * 
     */
    
    #include <Bounce.h>
    #include <Audio.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <SD.h>
    #include <TimeLib.h>
    #include <MTP_Teensy.h>
    #include "play_sd_wav.h" // local copy with fixes?
    
    // DEFINES
    // Define pins used by Teensy Audio Shield
    #define SDCARD_CS_PIN    10
    #define SDCARD_MOSI_PIN  7
    #define SDCARD_SCK_PIN   14
    // And those used for inputs
    #define HOOK_PIN 0
    #define PLAYBACK_BUTTON_PIN 1
    
    #define noINSTRUMENT_SD_WRITE
    
    // GLOBALS
    // Audio initialisation code can be generated using the GUI interface at https://www.pjrc.com/teensy/gui/
    // Inputs
    AudioSynthWaveform          waveform1; // To create the "beep" sfx
    AudioInputI2S               i2s2; // I2S input from microphone on audio shield
    AudioPlaySdWavX              playWav1; // Play 44.1kHz 16-bit PCM greeting WAV file
    AudioRecordQueue            queue1; // Creating an audio buffer in memory before saving to SD
    AudioMixer4                 mixer; // Allows merging several inputs to same output
    AudioOutputI2S              i2s1; // I2S interface to Speaker/Line Out on Audio shield
    AudioConnection patchCord1(waveform1, 0, mixer, 0); // wave to mixer 
    AudioConnection patchCord3(playWav1, 0, mixer, 1); // wav file playback mixer
    AudioConnection patchCord4(mixer, 0, i2s1, 0); // mixer output to speaker (L)
    AudioConnection patchCord6(mixer, 0, i2s1, 1); // mixer output to speaker (R)
    AudioConnection patchCord5(i2s2, 0, queue1, 0); // mic input to queue (L)
    AudioControlSGTL5000      sgtl5000_1;
    
    // Filename to save audio recording on SD card
    char filename[15];
    // The file object itself
    File frec;
    
    // Use long 40ms debounce time on both switches
    Bounce buttonRecord = Bounce(HOOK_PIN, 40);
    Bounce buttonPlay = Bounce(PLAYBACK_BUTTON_PIN, 40);
    
    // Keep track of current state of the device
    enum Mode {Initialising, Ready, Prompting, Recording, Playing};
    Mode mode = Mode::Initialising;
    
    float beep_volume = 0.04f; // not too loud :-)
    
    uint32_t MTPcheckInterval; // default value of device check interval [ms]
    
    // variables for writing to WAV file
    unsigned long ChunkSize = 0L;
    unsigned long Subchunk1Size = 16;
    unsigned int AudioFormat = 1;
    unsigned int numChannels = 1;
    unsigned long sampleRate = 44100;
    unsigned int bitsPerSample = 16;
    unsigned long byteRate = sampleRate*numChannels*(bitsPerSample/8);// samplerate x channels x (bitspersample / 8)
    unsigned int blockAlign = numChannels*bitsPerSample/8;
    unsigned long Subchunk2Size = 0L;
    unsigned long recByteSaved = 0L;
    unsigned long NumSamples = 0L;
    byte byte1, byte2, byte3, byte4;
    
    
    void setup() {
    
      Serial.begin(9600);
      while (!Serial && millis() < 5000) {
        // wait for serial port to connect.
      }
      Serial.println("Serial set up correctly");
      Serial.printf("Audio block set to %d samples\n",AUDIO_BLOCK_SAMPLES);
      print_mode();
      // Configure the input pins
      pinMode(HOOK_PIN, INPUT_PULLUP);
      pinMode(PLAYBACK_BUTTON_PIN, INPUT_PULLUP);
    
      // Audio connections require memory, and the record queue
      // uses this memory to buffer incoming audio.
      AudioMemory(60);
    
      // Enable the audio shield, select input, and enable output
      sgtl5000_1.enable();
      // Define which input on the audio shield to use (AUDIO_INPUT_LINEIN / AUDIO_INPUT_MIC)
      sgtl5000_1.inputSelect(AUDIO_INPUT_MIC);
      //sgtl5000_1.adcHighPassFilterDisable(); //
      sgtl5000_1.volume(0.95);
    
      mixer.gain(0, 1.0f);
      mixer.gain(1, 1.0f);
    
      // Play a beep to indicate system is online
      waveform1.begin(beep_volume, 440, WAVEFORM_SINE);
      wait(1000);
      waveform1.amplitude(0);
      delay(1000);
    
      // Initialize the SD card
      SPI.setMOSI(SDCARD_MOSI_PIN);
      SPI.setSCK(SDCARD_SCK_PIN);
      if (!(SD.begin(SDCARD_CS_PIN))) 
      {
        // stop here if no SD card, but print a message
        while (1) {
          Serial.println("Unable to access the SD card");
          delay(500);
        }
      }
        else Serial.println("SD card correctly initialized");
    
    
      // mandatory to begin the MTP session.
        MTP.begin();
    
      // Add SD Card
    //    MTP.addFilesystem(SD, "SD Card");
        MTP.addFilesystem(SD, "Kais Audio guestbook"); // choose a nice name for the SD card volume to appear in your file explorer
        Serial.println("Added SD card via MTP");
        MTPcheckInterval = MTP.storage()->get_DeltaDeviceCheckTimeMS();
        
        // Value in dB
    //  sgtl5000_1.micGain(15);
      sgtl5000_1.micGain(5); // much lower gain is required for the AOM5024 electret capsule
    
      // Synchronise the Time object used in the program code with the RTC time provider.
      // See https://github.com/PaulStoffregen/Time
      setSyncProvider(getTeensy3Time);
      
      // Define a callback that will assign the correct datetime for any file system operations
      // (i.e. saving a new audio recording onto the SD card)
      FsDateTime::setCallback(dateTime);
    
      mode = Mode::Ready; print_mode();
    }
    
    void loop() {
      // First, read the buttons
      buttonRecord.update();
      buttonPlay.update();
    
      switch(mode){
        case Mode::Ready:
          // Falling edge occurs when the handset is lifted --> 611 telephone
          if (buttonRecord.fallingEdge()) {
            Serial.println("Handset lifted");
            mode = Mode::Prompting; print_mode();
          }
          else if(buttonPlay.fallingEdge()) {
            //playAllRecordings();
            playLastRecording();
          }
          break;
    
        case Mode::Prompting:
          // Wait a second for users to put the handset to their ear
          wait(1000);
          // Play the greeting inviting them to record their message
          playWav1.play("greeting.wav");    
          // Wait until the  message has finished playing
    //      while (playWav1.isPlaying()) {
          while (!playWav1.isStopped()) {
            // Check whether the handset is replaced
            buttonRecord.update();
            buttonPlay.update();
            // Handset is replaced
            if(buttonRecord.risingEdge()) {
              playWav1.stop();
              mode = Mode::Ready; print_mode();
              return;
            }
            if(buttonPlay.fallingEdge()) {
              playWav1.stop();
              //playAllRecordings();
              playLastRecording();
              return;
            }
            
          }
          // Debug message
          Serial.println("Starting Recording");
          // Play the tone sound effect
          waveform1.begin(beep_volume, 440, WAVEFORM_SINE);
          wait(1250);
          waveform1.amplitude(0);
          // Start the recording function
          startRecording();
          break;
    
        case Mode::Recording:
          // Handset is replaced
          if(buttonRecord.risingEdge()){
            // Debug log
            Serial.println("Stopping Recording");
            // Stop recording
            stopRecording();
            // Play audio tone to confirm recording has ended
            end_Beep();
          }
          else {
            continueRecording();
          }
          break;
    
        case Mode::Playing: // to make compiler happy
          break;  
    
        case Mode::Initialising: // to make compiler happy
          break;  
      }   
      
      MTP.loop();  // This is mandatory to be placed in the loop code.
    }
    
    void setMTPdeviceChecks(bool nable)
    {
      if (nable)
      {
        MTP.storage()->set_DeltaDeviceCheckTimeMS(MTPcheckInterval);
        Serial.print("En");
      }
      else
      {
        MTP.storage()->set_DeltaDeviceCheckTimeMS((uint32_t) -1);
        Serial.print("Dis");
      }
      Serial.println("abled MTP storage device checks");
    }
      
    
    #if defined(INSTRUMENT_SD_WRITE)
    static uint32_t worstSDwrite, printNext;
    #endif // defined(INSTRUMENT_SD_WRITE)
    
    void startRecording() {
      setMTPdeviceChecks(false); // disable MTP device checks while recording
    #if defined(INSTRUMENT_SD_WRITE)
      worstSDwrite = 0;
      printNext = 0;
    #endif // defined(INSTRUMENT_SD_WRITE)
      // Find the first available file number
    //  for (uint8_t i=0; i<9999; i++) { // BUGFIX uint8_t overflows if it reaches 255  
      for (uint16_t i=0; i<9999; i++) {   
        // Format the counter as a five-digit number with leading zeroes, followed by file extension
        snprintf(filename, 11, " %05d.wav", i);
        // Create if does not exist, do not open existing, write, sync after write
        if (!SD.exists(filename)) {
          break;
        }
      }
      frec = SD.open(filename, FILE_WRITE);
      Serial.println("Opened file !");
      if(frec) {
        Serial.print("Recording to ");
        Serial.println(filename);
        queue1.begin();
        mode = Mode::Recording; print_mode();
        recByteSaved = 0L;
      }
      else {
        Serial.println("Couldn't open file to record!");
      }
    }
    
    void continueRecording() {
    #if defined(INSTRUMENT_SD_WRITE)
      uint32_t started = micros();
    #endif // defined(INSTRUMENT_SD_WRITE)
    #define NBLOX 16  
      // Check if there is data in the queue
      if (queue1.available() >= NBLOX) {
        byte buffer[NBLOX*AUDIO_BLOCK_SAMPLES*sizeof(int16_t)];
        // Fetch 2 blocks from the audio library and copy
        // into a 512 byte buffer.  The Arduino SD library
        // is most efficient when full 512 byte sector size
        // writes are used.
        for (int i=0;i<NBLOX;i++)
        {
          memcpy(buffer+i*AUDIO_BLOCK_SAMPLES*sizeof(int16_t), queue1.readBuffer(), AUDIO_BLOCK_SAMPLES*sizeof(int16_t));
          queue1.freeBuffer();
        }
        // Write all 512 bytes to the SD card
        frec.write(buffer, sizeof buffer);
        recByteSaved += sizeof buffer;
      }
      
    #if defined(INSTRUMENT_SD_WRITE)
      started = micros() - started;
      if (started > worstSDwrite)
        worstSDwrite = started;
    
      if (millis() >= printNext)
      {
        Serial.printf("Worst write took %luus\n",worstSDwrite);
        worstSDwrite = 0;
        printNext = millis()+250;
      }
    #endif // defined(INSTRUMENT_SD_WRITE)
    }
    
    void stopRecording() {
      // Stop adding any new data to the queue
      queue1.end();
      // Flush all existing remaining data from the queue
      while (queue1.available() > 0) {
        // Save to open file
        frec.write((byte*)queue1.readBuffer(), AUDIO_BLOCK_SAMPLES*sizeof(int16_t));
        queue1.freeBuffer();
        recByteSaved += AUDIO_BLOCK_SAMPLES*sizeof(int16_t);
      }
      writeOutHeader();
      // Close the file
      frec.close();
      Serial.println("Closed file");
      mode = Mode::Ready; print_mode();
      setMTPdeviceChecks(true); // enable MTP device checks, recording is finished
    }
    
    
    void playAllRecordings() {
      // Recording files are saved in the root directory
      File dir = SD.open("/");
      
      while (true) {
        File entry =  dir.openNextFile();
        if (strstr(entry.name(), "greeting"))
        {
           entry =  dir.openNextFile();
        }
        if (!entry) {
          // no more files
          entry.close();
          end_Beep();
          break;
        }
        //int8_t len = strlen(entry.name()) - 4;
    //    if (strstr(strlwr(entry.name() + (len - 4)), ".raw")) {
    //    if (strstr(strlwr(entry.name() + (len - 4)), ".wav")) {
        // the lines above throw a warning, so I replace them with this (which is also easier to read):
        if (strstr(entry.name(), ".wav") || strstr(entry.name(), ".WAV")) {
          Serial.print("Now playing ");
          Serial.println(entry.name());
          // Play a short beep before each message
          waveform1.amplitude(beep_volume);
          wait(750);
          waveform1.amplitude(0);
          // Play the file
          playWav1.play(entry.name());
          mode = Mode::Playing; print_mode();
        }
        entry.close();
    
    //    while (playWav1.isPlaying()) { // strangely enough, this works for playRaw, but it does not work properly for playWav
        while (!playWav1.isStopped()) { // this works for playWav
          buttonPlay.update();
          buttonRecord.update();
          // Button is pressed again
    //      if(buttonPlay.risingEdge() || buttonRecord.risingEdge()) { // FIX
          if(buttonPlay.fallingEdge() || buttonRecord.risingEdge()) { 
            playWav1.stop();
            mode = Mode::Ready; print_mode();
            return;
          }   
        }
      }
      // All files have been played
      mode = Mode::Ready; print_mode();
    }
    
    void playLastRecording() {
      // Find the first available file number
      uint16_t idx = 0; 
      for (uint16_t i=0; i<9999; i++) {
        // Format the counter as a five-digit number with leading zeroes, followed by file extension
        snprintf(filename, 11, " %05d.wav", i);
        // check, if file with index i exists
        if (!SD.exists(filename)) {
         idx = i - 1;
         break;
          }
      }
          // now play file with index idx == last recorded file
          snprintf(filename, 11, " %05d.wav", idx);
          Serial.println(filename);
          playWav1.play(filename);
          mode = Mode::Playing; print_mode();
          while (!playWav1.isStopped()) { // this works for playWav
          buttonPlay.update();
          buttonRecord.update();
          // Button is pressed again
    //      if(buttonPlay.risingEdge() || buttonRecord.risingEdge()) { // FIX
          if(buttonPlay.fallingEdge() || buttonRecord.risingEdge()) {
            playWav1.stop();
            mode = Mode::Ready; print_mode();
            return;
          }   
        }
          // file has been played
      mode = Mode::Ready; print_mode();  
      end_Beep();
    }
    
    
    // Retrieve the current time from Teensy built-in RTC
    time_t getTeensy3Time(){
      return Teensy3Clock.get();
    }
    
    // Callback to assign timestamps for file system operations
    void dateTime(uint16_t* date, uint16_t* time, uint8_t* ms10) {
    
      // Return date using FS_DATE macro to format fields.
      *date = FS_DATE(year(), month(), day());
    
      // Return time using FS_TIME macro to format fields.
      *time = FS_TIME(hour(), minute(), second());
    
      // Return low time bits in units of 10 ms.
      *ms10 = second() & 1 ? 100 : 0;
    }
    
    // Non-blocking delay, which pauses execution of main program logic,
    // but while still listening for input 
    void wait(unsigned int milliseconds) {
      elapsedMillis msec=0;
    
      while (msec <= milliseconds) {
        buttonRecord.update();
        buttonPlay.update();
        if (buttonRecord.fallingEdge()) Serial.println("Button (pin 0) Press");
        if (buttonPlay.fallingEdge()) Serial.println("Button (pin 1) Press");
        if (buttonRecord.risingEdge()) Serial.println("Button (pin 0) Release");
        if (buttonPlay.risingEdge()) Serial.println("Button (pin 1) Release");
      }
    }
    
    
    void writeOutHeader() { // update WAV header with final filesize/datasize
    
    //  NumSamples = (recByteSaved*8)/bitsPerSample/numChannels;
    //  Subchunk2Size = NumSamples*numChannels*bitsPerSample/8; // number of samples x number of channels x number of bytes per sample
      Subchunk2Size = recByteSaved - 42; // because we didn't make space for the header to start with! Lose 21 samples...
      ChunkSize = Subchunk2Size + 34; // was 36;
      frec.seek(0);
      frec.write("RIFF");
      byte1 = ChunkSize & 0xff;
      byte2 = (ChunkSize >> 8) & 0xff;
      byte3 = (ChunkSize >> 16) & 0xff;
      byte4 = (ChunkSize >> 24) & 0xff;  
      frec.write(byte1);  frec.write(byte2);  frec.write(byte3);  frec.write(byte4);
      frec.write("WAVE");
      frec.write("fmt ");
      byte1 = Subchunk1Size & 0xff;
      byte2 = (Subchunk1Size >> 8) & 0xff;
      byte3 = (Subchunk1Size >> 16) & 0xff;
      byte4 = (Subchunk1Size >> 24) & 0xff;  
      frec.write(byte1);  frec.write(byte2);  frec.write(byte3);  frec.write(byte4);
      byte1 = AudioFormat & 0xff;
      byte2 = (AudioFormat >> 8) & 0xff;
      frec.write(byte1);  frec.write(byte2); 
      byte1 = numChannels & 0xff;
      byte2 = (numChannels >> 8) & 0xff;
      frec.write(byte1);  frec.write(byte2); 
      byte1 = sampleRate & 0xff;
      byte2 = (sampleRate >> 8) & 0xff;
      byte3 = (sampleRate >> 16) & 0xff;
      byte4 = (sampleRate >> 24) & 0xff;  
      frec.write(byte1);  frec.write(byte2);  frec.write(byte3);  frec.write(byte4);
      byte1 = byteRate & 0xff;
      byte2 = (byteRate >> 8) & 0xff;
      byte3 = (byteRate >> 16) & 0xff;
      byte4 = (byteRate >> 24) & 0xff;  
      frec.write(byte1);  frec.write(byte2);  frec.write(byte3);  frec.write(byte4);
      byte1 = blockAlign & 0xff;
      byte2 = (blockAlign >> 8) & 0xff;
      frec.write(byte1);  frec.write(byte2); 
      byte1 = bitsPerSample & 0xff;
      byte2 = (bitsPerSample >> 8) & 0xff;
      frec.write(byte1);  frec.write(byte2); 
      frec.write("data");
      byte1 = Subchunk2Size & 0xff;
      byte2 = (Subchunk2Size >> 8) & 0xff;
      byte3 = (Subchunk2Size >> 16) & 0xff;
      byte4 = (Subchunk2Size >> 24) & 0xff;  
      frec.write(byte1);  frec.write(byte2);  frec.write(byte3);  frec.write(byte4);
      frec.close();
      Serial.println("header written"); 
      Serial.print("Subchunk2: "); 
      Serial.println(Subchunk2Size); 
    }
    
    void end_Beep(void) {
              waveform1.frequency(523.25);
            waveform1.amplitude(beep_volume);
            wait(250);
            waveform1.amplitude(0);
            wait(250);
            waveform1.amplitude(beep_volume);
            wait(250);
            waveform1.amplitude(0);
            wait(250);
            waveform1.amplitude(beep_volume);
            wait(250);
            waveform1.amplitude(0);
            wait(250);
            waveform1.amplitude(beep_volume);
            wait(250);
            waveform1.amplitude(0);
    }
    
    void print_mode(void) { // only for debugging
      Serial.print("Mode switched to: ");
      // Initialising, Ready, Prompting, Recording, Playing
      if(mode == Mode::Ready)           Serial.println(" Ready");
      else if(mode == Mode::Prompting)  Serial.println(" Prompting");
      else if(mode == Mode::Recording)  Serial.println(" Recording");
      else if(mode == Mode::Playing)    Serial.println(" Playing");
      else if(mode == Mode::Initialising)  Serial.println(" Initialising");
      else Serial.println(" Undefined");
    }

  19. #44
    there is a wav file on the sd card as well btw

  20. #45
    Senior Member BriComp's Avatar
    Join Date
    Apr 2014
    Location
    Cheltenham, UK
    Posts
    1,141
    Ok, look to see if the files play_sd_wav.h and play_sd_wav.cpp are in your audio-guestbook directory.

  21. #46
    Senior Member h4yn0nnym0u5e's Avatar
    Join Date
    Apr 2021
    Location
    Cambridgeshire, UK
    Posts
    630
    Quote Originally Posted by BriComp View Post
    Oh dear, I have just compiled the copy I downloaded to my PC without any error.
    Do you have this line in your code: #include "play_sd_wav.h" // local copy with fixes?
    I have just commented it out on my copy and get exactly the same error as you are experiencing.
    EDIT:
    The line in question should be around line 31.

    The code below is what the start of my program look like.
    Code:
    /**
     * Audio Guestbook, Copyright (c) 2022 Playful Technology
     * 
     * Tested using a Teensy 4.0 with Teensy Audio Shield, although should work 
     * with minor modifications on other similar hardware
     * 
     * When handset is lifted, a pre-recorded greeting message is played, followed by a tone.
     * Then, recording starts, and continues until the handset is replaced.
     * Playback button allows all messages currently saved on SD card through earpiece 
     * 
     * Files are saved on SD card as 44.1kHz, 16-bit, mono signed integer RAW audio format 
     * --> changed this to WAV recording, DD4WH 2022_07_31
     * --> added MTP support, which enables copying WAV files from the SD card via the USB connection, DD4WH 2022_08_01
     * 
     * 
     * Frank DD4WH, August 1st 2022 
     * for a DBP 611 telephone (closed contact when handheld is lifted) & with recording to WAV file
     * contact for switch button 0 is closed when handheld is lifted
     * 
     * GNU GPL v3.0 license
     * 
     */
    
    #include <Bounce.h>
    #include <Audio.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <SD.h>
    #include <TimeLib.h>
    #include <MTP_Teensy.h>
    #include "play_sd_wav.h" // local copy with fixes
    My post#38, second and third bullet points ... your posted code has been modified, though not actually in an important way (someone added a question mark after the line @BriComp highlighted). More important, it looks as if the carefully modified play_sd_wav.cpp and play_sd_wav.h are no longer in the sketch folder. It appears that Arduino somehow glosses over the loss of play_sd_wav.h, probably by including the file of the same name from the Audio library, but as a consequence can't find the definition for the AudioPlaySdWavX class.

  22. #47
    in the directory
    Click image for larger version. 

Name:	Screenshot (4).jpg 
Views:	24 
Size:	57.5 KB 
ID:	30301

  23. #48
    Senior Member BriComp's Avatar
    Join Date
    Apr 2014
    Location
    Cheltenham, UK
    Posts
    1,141
    Copy ALL THE FILES, but NOT the audio-guestbook directory and paste them INTO the audio-guestbook directory.

  24. #49
    no error message now but gotta amplify it all as cant hear message or bleep and very quite on play back

  25. #50
    Senior Member BriComp's Avatar
    Join Date
    Apr 2014
    Location
    Cheltenham, UK
    Posts
    1,141
    Quote Originally Posted by carpracing View Post
    no error message now but gotta amplify it all as cant hear message or bleep and very quite on play back
    Glad you got it to compile. I guess now you know how data and directories are arranged for programs/sketches and libraries.

    How are you trying to listen to the sounds?

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •