极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13374|回复: 9

关于用arduin播放音乐的问题。请教

[复制链接]
发表于 2014-3-28 15:41:50 | 显示全部楼层 |阅读模式
搞不懂“SimpleSDAudio”,是怎样实现读取SD数据播放音乐的,就是Play函数、我希望在读取的时候,加入一些控制,不知可不可。。。
回复

使用道具 举报

 楼主| 发表于 2014-3-28 18:24:18 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2014-3-28 19:45:46 | 显示全部楼层
用过tmrpcm,播放的时候可以控制
SimpleSDAudio没用过,看一下说明应该是在主程序中跑worker(),估计也可以控制
不过转档后音质只能说是勉强能听,最后还是直上vs1003,mp3 320kbps无压力

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-28 23:50:09 | 显示全部楼层

void SdPlayClass::worker(void) {
  if(_pBuf && _fileinfo.Size) {
    uint16_t buflencpy;
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
    {
      buflencpy = _Buflen;
    }      
    if(_fileinfo.ActBytePos < _fileinfo.Size) {
        // At least space for 1 sector?
        if(buflencpy < (_Bufsize - 512)) {
            int16_t ret;
            ret = SD_L1_ReadBlock(_fileinfo.ActSector++, _pBuf + _Bufin);
            if(!ret) {
               uint32_t BytesLeft = _fileinfo.Size - _fileinfo.ActBytePos;
               _Bufin += 512;
               _fileinfo.ActBytePos += 512;
               if(_Bufin >= _Bufsize) _Bufin -= _Bufsize;
               if(BytesLeft >= 512UL) {
                   ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
                   {
                     _Buflen += 512;
                   }
                } else {
                   ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
                   {
                     _Buflen += BytesLeft;
                   }               
                }
            } else {
              stop();
              _lastError = ret;
            }
        }
    } else {
      // Playback done
      if(buflencpy <= 1) {
        stop();
      }
    }
  }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-28 23:51:11 | 显示全部楼层
Be1ieve 发表于 2014-3-28 19:45
用过tmrpcm,播放的时候可以控制
SimpleSDAudio没用过,看一下说明应该是在主程序中跑worker(),估计也可以 ...

谢谢指教!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-28 23:51:54 | 显示全部楼层
Be1ieve 发表于 2014-3-28 19:45
用过tmrpcm,播放的时候可以控制
SimpleSDAudio没用过,看一下说明应该是在主程序中跑worker(),估计也可以 ...

是这个?不知该怎样改动。。。
回复 支持 反对

使用道具 举报

发表于 2014-3-29 08:48:57 | 显示全部楼层
库里面的东西除非作者有说要改不然不要动

下面是tmrpcm的范例,库在相关帖子有自己找
  1. #include <SD.h>
  2. #include <SPI.h>
  3. #include <TMRpcm.h>

  4. #define SD_PIN 4
  5. #define SPEAKER_PIN 9

  6. TMRpcm audio;

  7. void setup(){
  8.   Serial.begin(115200);
  9.   while(!Serial); Serial.println();
  10.   
  11.   audio.speakerPin = SPEAKER_PIN;
  12.   if(!SD.begin(SD_PIN)){
  13.     Serial.println("Fail to open SD card.");
  14.   }
  15.   else{
  16.     Serial.println("SD card is ready.");
  17.     audio.play("startup.wav");
  18.   }
  19. }

  20. void loop(){
  21. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-29 09:10:13 | 显示全部楼层
Be1ieve 发表于 2014-3-29 08:48
库里面的东西除非作者有说要改不然不要动

下面是tmrpcm的范例,库在相关帖子有自己找

哦哦!不知道还有tmrpcm,我试试行不行






回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-30 09:33:24 | 显示全部楼层
Be1ieve 发表于 2014-3-29 08:48
库里面的东西除非作者有说要改不然不要动

下面是tmrpcm的范例,库在相关帖子有自己找

还是搞不明白怎样控制。。有加控制的范例吗??
回复 支持 反对

使用道具 举报

发表于 2014-3-30 18:36:07 | 显示全部楼层
tmrpcm.play("filename"); plays a file
tmrpcm.speakerPin = 11; set to 5,6,11 or 46 for Mega, 9 for Uno, Nano, etc
tmrpcm.disable(); disables the timer on output pin and stops the music
tmrpcm.stopPlayback(); stops the music, but leaves the timer running
tmrpcm.isPlaying();  returns 1 if music playing, 0 if not
tmrpcm.pause();  pauses/unpauses playback
tmrpcm.volume(0); 1(up) or 0(down) to control volume

所有控制就這些而已
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 09:41 , Processed in 0.040371 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表