使用SFEMP3Shield.h库的错误消息试图实现播放/暂停代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用SFEMP3Shield.h库的错误消息试图实现播放/暂停代码相关的知识,希望对你有一定的参考价值。

我目前在尝试编辑一些代码时碰到了砖墙。我正在尝试在代码中输入一个暂停/恢复片段,以便在触摸电极时-如果正在播放,它将暂停,然后通过再次触摸它就可以恢复。

使用我当前的代码编辑,一旦暂停,该曲目就不会恢复。

我正在道歉的过程中学习,如果这是一个显而易见的解决方法。任何帮助将不胜感激!

链接到图书馆的使用在这里:https://github.com/mpflaga/Sparkfun-MP3-Player-Shield-Arduino-Library

请在下面查看我正在使用的代码!

// compiler error handling
#include "Compiler_Errors.h"

// touch includes
#include <MPR121.h>
#include <Wire.h>
#define MPR121_ADDR 0x5C
#define MPR121_INT 4

// mp3 includes
#include <SPI.h>
#include <SdFat.h>
#include <FreeStack.h> 
#include <SFEMP3Shield.h>

// mp3 variables
SFEMP3Shield MP3player;
byte result;
int lastPlayed = 0;

// mp3 behaviour defines
#define REPLAY_MODE FALSE  // By default, touching an electrode repeatedly will 
                          // play the track again from the start each time.
                          //
                          // If you set this to FALSE, repeatedly touching an 
                          // electrode will stop the track if it is already 
                          // playing, or play it from the start if it is not.

// touch behaviour definitions
#define firstPin 0
#define lastPin 11

// sd card instantiation
SdFat sd;

void setup()  
  Serial.begin(57600);

  pinMode(LED_BUILTIN, OUTPUT);

  //while (!Serial) ;  //uncomment when using the serial monitor 
  Serial.println("Bare Conductive Touch MP3 player");

  if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) sd.initErrorHalt();

  if(!MPR121.begin(MPR121_ADDR)) Serial.println("error setting up MPR121");
  MPR121.setInterruptPin(MPR121_INT);

  MPR121.setTouchThreshold(5);
  MPR121.setReleaseThreshold(5);

  result = MP3player.begin();
  MP3player.setVolume(10,10);

  if(result != 0) 
    Serial.print("Error code: ");
    Serial.print(result);
    Serial.println(" when trying to start MP3 player");
   



void loop()
  readTouchInputs();



void readTouchInputs()
  if(MPR121.touchStatusChanged())

    MPR121.updateTouchData();
    // only make an action if we have one or fewer pins touched
    // ignore multiple touches

    if(MPR121.getNumTouches()<=1)
      for (int i=0; i < 12; i++)  // Check which electrodes were pressed
        if(MPR121.isNewTouch(i))

            //pin i was just touched
            Serial.print("pin ");
            Serial.print(i);
            Serial.println(" was just touched");
            digitalWrite(LED_BUILTIN, HIGH);

            if(i<=lastPin && i>=firstPin)
              if(MP3player.isPlaying())
                if(lastPlayed==i && !REPLAY_MODE)
                  // if we're already playing the requested track, stop it
                  // (but only if we're not in REPLAY_MODE)
                  MP3player.pauseMusic();
                  Serial.print("paused_playback");
                  Serial.println(MP3player.getState());

                 

                else 
                 // if the track is already paused, resume the track
                 if (MP3player.getState() == paused_playback)
                 if(lastPlayed==i)                
                 MP3player.resumeMusic();
                 Serial.print("resuming");
                 Serial.println(i-firstPin);

                    else  
                  // if we're already playing a different track (or we're in
                  // REPLAY_MODE), stop and play the newly requested one
                  MP3player.stopTrack();
                  MP3player.playTrack(i-firstPin);
                  Serial.print("playing track ");
                  Serial.println(i-firstPin);

                  // don't forget to update lastPlayed - without it we don't
                  // have a history
                  lastPlayed = i;
                
                
                
               else 
                // if we're playing nothing, play the requested track 
                // and update lastplayed
                MP3player.playTrack(i-firstPin);
                Serial.print("playing track ");
                Serial.println(i-firstPin);
                lastPlayed = i;
              
                 
         else 
          if(MPR121.isNewRelease(i))
            Serial.print("pin ");
            Serial.print(i);
            Serial.println(" is no longer being touched");
            digitalWrite(LED_BUILTIN, LOW);
          
        
      
    
  


再次感谢!

答案

问题是if (MP3player.getState() == paused_playback)嵌套在if (MP3player.isPlaying())中。

if (MP3player.isPlaying()) 
    if (lastPlayed == i && !REPLAY_MODE) 
        MP3player.pauseMusic();
        Serial.println(MP3player.getState());
     else 
        if (MP3player.getState() == paused_playback)  // getState() always returns playback
            if (lastPlayed == i)                 
                MP3player.resumeMusic();
             else  
                MP3player.stopTrack();
                MP3player.playTrack(i-firstPin);
                lastPlayed = i;
            
        
    
 else 
    MP3player.playTrack(i-firstPin);
    lastPlayed = i;

除非MP3player的状态在后台更新,否则getState()始终在playback处返回if (MP3player.getState() == paused_playback),并且永远不会调用resumeMusic()

以上是关于使用SFEMP3Shield.h库的错误消息试图实现播放/暂停代码的主要内容,如果未能解决你的问题,请参考以下文章

使用 WIFE Java 库的 SWIFT MT 消息解析

试图将两个 json 数据放入 python 列表但收到错误消息

java.lang.NullPointerException(没有错误消息)当试图使标志apk

尝试使用类型库,但出现 File Not Found 错误

库试图加载错误版本的程序集

奇怪的错误,collectionView 视图滚动到倒数第二条消息,当试图滚动到底部