Gorgon_Meducer 发表于 2015-1-4 23:34:52

[交流][开源]豆瓣FM播放器嵌入式极限挑战(2015-2-04更新)

本帖最后由 Gorgon_Meducer 于 2015-2-4 17:31 编辑

傻孩子图书工作室作品


STAFF

   
    Hardware Design         Bean
    Driver Design                y574924080qufuta

    Architecture Design       Gorgon_Meducer


ACKNOWLEDGE
   
    Armok


说在前面的话
    这是一个极限挑战的项目。

    2年前,我发起了傻孩子图书工作室这个开源组织,并邀更多的人加入开源计划,从那时起,陆陆续续
对技术抱有浓厚兴趣的坛友开始加入。经过松散而漫长的培训,现在终于开始进行第一个自发的开源项目
挑战(所谓自发是指并非由阿莫提议的项目)。

    我们决定从豆瓣FM播放器开始。首先这是一个WiFi播放器,计划首先从资源相对丰富的ARM Cortex M3
芯片入手,首先完成豆瓣FM播放器的原型机。接下来,我们会不断挑战自我,逐步降低处理器级别,挑战
M0,16位机甚至是8位机;逐步降低对系统资源的消耗,降低SRAM用量使其适应小资源MCU的环境;逐步
降低成本,加深我们对嵌入式系统的理解。这会是一个漫长的过程,但千里之行始于足下,我们本来就是
一群视技术为乐趣的人。

    第一个版本的原型机会采用Cortex M3级别的芯片,使用SD卡作为音乐的缓冲区,通过WiFi模块配合
lwIP网络协议栈连接豆瓣服务器,将数据首先下载到SD卡中缓存起来;系统采用一块Vx10xx MP3解码
芯片实现音乐的解码和播放。播放模块始终从SD卡中读取缓存的音乐,从而避免由于网络不稳定带来的
糟糕的播放体验。为了保护该开源项目,SD卡将不使用任何标准的文件系统,我们会将其视作一个巨大
的FLASH缓冲区使用,配合一个简单的链表式存储结构来保存和索引音乐文件。为了解决TCP下载音乐
到SD卡以及从SD进行音乐播放时产生的读写冲突,我们引入了两个SPI Flash作为中间的乒乓双缓冲介质。

    第二个版本将考虑采用Cortex M0级别的芯片,并尝试将SRAM用量控制到10K以内。


- 2015-2-04
    a. 更新硬件原理图,更新成品图片
      

- 2015-2-03
    a. 完成了第一版硬件的制作,开始调试
   
   

- 2015-1-26
    a. 补充了xmodem的接口依赖

/*----------------------------------------------------------------------------*
*            DEPENDENT INTERFACE                                           *
*----------------------------------------------------------------------------*/

/*! \brief xmodem lower layer byte write
*! \param chByte xmodem usart write byte
*! \return none
*/
extern bool xmodem_lower_layer_write(uint8_t chByte);

/*! \brief xmodem lower layer byte read
*! \param pchByte xmodem usart write byte
*! \return none
*/
extern bool xmodem_lower_layer_read(uint8_t *pchByte);

/*! \brief update next buffer or control transfer speed
*! \param none
*! \return buffer address
*/
extern uint8_t * xmodem_call_back_receive(void);

- 2015-1-25
    a. 更新xmodem驱动
      i. 修改xmodem接口,通过xmodem_init的参数来选择xmodem的工作模式(256字节模式和1K字节
          模式)

...
/*============================ MACROFIED FUNCTIONS ===========================*/
#define XMODEM_CFG(__MODE, __BUFFER)      \
    do {                                    \
      xmodem_t tCFG = {                   \
            .pchBuffer = __BUFFER,          \
            .tMode = __MODE               \
      };                                  \
      xomdem_init(&tCFG);               \
    } while (0)

/*============================ TYPES =========================================*/
//! \name xmodem receive configuration
//! @{
typedef struct {
    uint8_t *pchBuffer;         //!< receive buffer
    enum {
      XMODEM_BLOCK_SZ_256= 0,
      XMODEM_BLOCK_SZ_1K,
    } tMode;
} xmodem_t;
//! @}

/*============================ GLOBAL VARIABLES ==============================*/
/*============================ LOCAL VARIABLES ===============================*/
/*============================ PROTOTYPES ====================================*/

/*! \brief initialize xmodem receive service
*! \param pchBuffer xmodem receive configuration
*\retval true xmodem receive service initialization succeeded
*\retval false xmodem receive service initialization failed
*/
extern bool xomdem_init(xmodem_t *ptCFG);

/*! \brief xmodem task
*! \retrun fsm_rt_cpl xmodem transfer finish
*! \retrun fsm_rt_on_going xmodem transfer on-going
*! \retrun fsm_rt_on_err xmodem transfer error
*! \retrun fsm_rt_asyn xmodem receive a packet
*/
extern fsm_rt_t xomdem_task(void);
...

      ii.支持多重缓冲模式(双缓冲是多重缓冲的最简单形式),用户需要在强制接口(离开他就不能
            正常实现功能的接口)中,通过返回值来提供下一个数据缓冲区的指针,通过这种方式,用户
            可以选择使用单缓冲(直接返回同一个缓冲的指针),或者选择多重缓冲(返回新缓冲区的指针)
            
            这种做法的好处是可以简化用户的行为(减少不必要的由灵活度带来的出错可能),同时减少
            不必要的接口API(比如用来设置Buffer的API)

/*! \brief update next buffer or control transfer speed
*! \param none
*! \return buffer address
*/
extern uint8_t * xmodem_call_back_receive(void);


- 2015-1-14
    a. 更新Vs10xx驱动
      i.完善vs10xx的驱动, 包括播放/停止/音量调节/复位/使能/禁能
   
//! \name vs1003 interface
//! @{
DEF_INTERFACE (i_vs10xx_t)
    fsm_rt_t    (*Init)   (vs10xx_cfg_t *ptVsCfg);
    bool      (*Enable)   (void);
    bool      (*Disable)(void);
    bool      (*Pause)    (void);
    bool      (*Resume)   (void);
    fsm_rt_t    (*Play)   (const uint8_t *pchStream, uint_fast16_t wSize);
    fsm_rt_t    (*Volume)   (uint8_t chLeftVol, uint8_t chRightVol);

    fsm_rt_t    (*Reset)    (void);
   
    struct {
      fsm_rt_t    (*Write)    (uint8_t chRegAddr, uint16_t hwData);
      fsm_rt_t    (*Read)   (uint8_t chRegAddr, uint16_t *pchData);
    } Register;
   
END_DEF_INTERFACE (i_vs10xx_t)
//! @}

      ii. 修改console命令, 增加音乐停止播放、继续播放、音量调节、复位vs10xx模块等命令

ROOT bool app_init(void)
{
    xmodem_usart_init();
    console_usart_init();
    console_init();

    do {
      static const command_t s_chCommand[] = {
            {"wsci",    "\twsci \twrite sci register\r\n", &sci_write},
            {"rsci",    "\trsci \tread sci register\r\n", &sci_read},
            {"puase",   "\tpuase \tpuase\r\n", &play_pause},
            {"resume","\tresume \tresume\r\n", &play_resume},
            {"reset",   "\treset \treset vs10xx\r\n", &play_reset},
            {"vol",   "\tvol \tvs10xx volume update\r\n", &play_vol},
      };
      console_cmd_register(s_chCommand, UBOUND(s_chCommand));
    } while (false);

    while (1) {
      uart_play_task();
      console_task();
    }

    return true;
}



- 2015-1-6
    a. 更新第一个测试版本的数据流图
      
- 2015-1-4
    a. 发布第一个测试版本
            该版本使用改进的xmodem协议进行简单的流控制,通过超级终端播放(下载)MP3文件到
      系统进行缓冲,并由系统发送到Vx10xx模块。
    b. 发布Vx10xx测试驱动
            该驱动包含基本的播放功能和寄存器操作接口。相关移植说明请参考压缩包中的说明文档
            
    c. 发布完整的原型机系统结构图
            

相关下载
    工程模板 (未更新xmodem驱动的版本)
    Vx10xx的培训文档
    xmodem驱动
    第一版硬件原理图
   



Gorgon_Meducer 发表于 2015-1-4 23:36:40

占楼,占楼

gzhuli 发表于 2015-1-4 23:38:25

本帖最后由 gzhuli 于 2015-1-4 23:41 编辑

沙发~

这个真是挑战自我了,话说09年RT-Thread就在STM32F103上实现了MP3软解和豆瓣FM在线播放,今天再搞这个的话还是树莓派比较有实用价值。

zhenyifei 发表于 2015-1-4 23:38:56

学习,mark。。。。

Jordan?? 发表于 2015-1-4 23:41:25

学习一下

mypc16888 发表于 2015-1-4 23:41:39

很有意思,关注中

tanek 发表于 2015-1-4 23:41:57

围观,围观

ndt2000 发表于 2015-1-4 23:46:27

排队学习

levinxia 发表于 2015-1-4 23:47:46

学习一下。努力让自己多学点知识。

wangchin1988 发表于 2015-1-4 23:50:20

学习学习!!!

1ongquan 发表于 2015-1-4 23:50:35

马克   一直想加入傻孩子的助手行列,可惜工作忙得没心情

霸气侧漏 发表于 2015-1-4 23:51:11

关注中加油

stely 发表于 2015-1-4 23:51:49

关注!很是期待。

zyw19987 发表于 2015-1-5 07:26:21

靠!激动的说不出话啊

disheng 发表于 2015-1-5 08:02:01

感兴趣,关注中

tim 发表于 2015-1-5 08:06:46

Hardware Design的id一看就是牛人{:titter:}

lea2005 发表于 2015-1-5 08:07:57

曾经做过类似的东西。关注楼主。。。

jeasey 发表于 2015-1-5 08:12:20

值得学习的项目,09年左右当是想使用LM3S做一个这样的,板子都做回来了,但是没有时间调试,一直放哪儿了

ijlc1314 发表于 2015-1-5 08:17:08

支持一下

liangyurongde 发表于 2015-1-5 08:29:08

跟大师学习了!

lanyuye 发表于 2015-1-5 08:33:25

非常有激情啊

tiger5 发表于 2015-1-5 08:34:30

关注


学习。


落叶知秋 发表于 2015-1-5 08:43:07

关注学习中,这个项目挺有意思的

Shampoo 发表于 2015-1-5 08:43:08

占座。
学习。

Ilidan 发表于 2015-1-5 08:46:22

前排占座,学习一下

bccdn 发表于 2015-1-5 08:47:02

这个喜欢。很有意思

jiaowoxiaolu 发表于 2015-1-5 08:49:40

我发现豆瓣FM电台放的歌曲都是不停重复的,每个分类的曲库就那么几十首歌,播完又重新循环,好久都不更新的,挺多了就不想再听了,这个要如何是好?

1148729990 发表于 2015-1-5 08:50:56

关注学习

happyliu 发表于 2015-1-5 08:52:08

关注,有空打板做一个,没做过M3+WIFI,跟做一个学习一下,

soosqt 发表于 2015-1-5 08:58:55

关注,搬登子

nimo 发表于 2015-1-5 09:00:06

值得学习

shower.xu 发表于 2015-1-5 09:00:09

WIFI模块是EMW1062,taobao搜了一下,看介绍说对RAM要求较高,这个怎么解决?
EMW1062跟EMW3162对比,主要变化如下:

1:模块提供SDIO/SPI接口,片上不包含MCU;

2:mxchip提供STM32F2 和F4系列MCU驱动库,快速实现Wi-Fi网络通讯功能,可实现EMW3162具备的所有功能,如easylink等;(对MCU需求:Flash≥1M,RAM ≥96k,如果Flash 是512K,则没有OTA功能,若需要OTA功能,需外加SPI Flash)

imliyucai 发表于 2015-1-5 09:01:53

关注。豆瓣FM 还是第一次听说。

lgg88 发表于 2015-1-5 09:03:57

跟大师学习。。。。真心不错

motoedy 发表于 2015-1-5 09:05:46

支持傻孩子的开源。。。{:victory:}

Gorgon_Meducer 发表于 2015-1-5 09:06:33

jiaowoxiaolu 发表于 2015-1-5 08:49
我发现豆瓣FM电台放的歌曲都是不停重复的,每个分类的曲库就那么几十首歌,播完又重新循环,好久都不更新的 ...

有红星歌曲就会很不同了

guanglv2008 发表于 2015-1-5 09:06:59

关注期待各位的大作

yihui184 发表于 2015-1-5 09:08:23

支持啊!好象野火的教程里也有一个关于播放豆瓣音乐的教程!

didadida 发表于 2015-1-5 09:11:35

顶顶顶{:lol:}

Samzzt 发表于 2015-1-5 09:13:33

有意思啊

sunzhuojun 发表于 2015-1-5 09:14:17

支持,学习一下

youthdou 发表于 2015-1-5 09:16:16

顶一下。顺便看看某些解决方法。

gongshu 发表于 2015-1-5 09:22:01

排队 学习

Gorgon_Meducer 发表于 2015-1-5 09:22:18

gzhuli 发表于 2015-1-4 23:38
沙发~

这个真是挑战自我了,话说09年RT-Thread就在STM32F103上实现了MP3软解和豆瓣FM在线播放,今天再搞 ...

团队开会选项目的时候,我还没来得及说啥,大家就决定做这个了。本来团队的初衷就是做大家觉得好玩的东西,所以就这么决定了,至于实用价值,中间很多产物的价值都高于这个项目的功能本身。这次是裸奔,所以和TR-Thread环境还是很不同的。

zml322 发表于 2015-1-5 09:29:19

排队学习,很好玩啊

chjf 发表于 2015-1-5 09:37:09

关注,学习一下。

yikuang 发表于 2015-1-5 12:20:30

围观围观!

bondxie3 发表于 2015-1-5 12:46:23

好久不见版主大人了哦!
项目附带的编程模式,系统调度,界面编制等等都值得期待哦!

gzhuli 发表于 2015-1-5 16:33:55

Gorgon_Meducer 发表于 2015-1-5 09:22
团队开会选项目的时候,我还没来得及说啥,大家就决定做这个了。本来团队的初衷就是做大家觉得好玩的东西 ...

嗯,其实这种项目最主要的功能就是验证系统架构思路。

leicai05 发表于 2015-1-5 16:59:23

帮凳子,学习。

Gorgon_Meducer 发表于 2015-1-5 17:01:25

gzhuli 发表于 2015-1-5 16:33
嗯,其实这种项目最主要的功能就是验证系统架构思路。

是啊,估计这也是为什么他们挑选这个作为入手点的原因。如果是我选,多半会做GUI之类的。

z13900139000 发表于 2015-1-5 17:03:25

关注楼主。。。

binaimei2007 发表于 2015-1-5 17:10:35

好像豆瓣音乐的歌现在大部分都是MP4格式,AAC压缩的

fsmcu 发表于 2015-1-5 17:23:09

持续关注,不知这种wifi模块价格如何

Gorgon_Meducer 发表于 2015-1-5 18:56:32

本帖最后由 Gorgon_Meducer 于 2015-1-5 19:35 编辑

binaimei2007 发表于 2015-1-5 17:10
好像豆瓣音乐的歌现在大部分都是MP4格式,AAC压缩的
Vx1053支持AAC,不担心

cddxhy 发表于 2015-1-5 19:57:37

好东西,跟上!!

cece_co 发表于 2015-1-5 20:05:45

围观楼主

cne53102 发表于 2015-1-5 20:57:54

经常听豆瓣FM,这个真心好!~~

lilolog 发表于 2015-1-5 21:08:27

顶,喜欢这种原始的方式。

rtems 发表于 2015-1-5 21:23:58

用单片ESP8266试试看,比较好玩

tcpln 发表于 2015-1-5 21:32:51

嗯,8266内部跑的就是lwip

fengxin32 发表于 2015-1-5 22:45:37

网络收音机?和服务器的协议比较麻烦,播放MP3对这个论坛的人来说难度不大,尤其是还有解码芯片……

xiaoliusheng 发表于 2015-1-5 22:47:14

楼主哥哥 , 你的新书写完了没?

Puppey 发表于 2015-1-5 22:55:23

支持傻孩子=-= 都太厉害啦

Puppey 发表于 2015-1-5 22:55:38

P.s 期待楼主新书啊

Gorgon_Meducer 发表于 2015-1-6 10:21:04

更新数据流图

ArthurBruin 发表于 2015-1-6 13:17:57

强烈支持老大事业

tanek 发表于 2015-1-7 11:14:35

fengxin32 发表于 2015-1-5 22:45
网络收音机?和服务器的协议比较麻烦,播放MP3对这个论坛的人来说难度不大,尤其是还有解码芯片…… ...

做出来的确难度不是特大。如果是在小资源的片子上实现就有点难度了。

binaimei2007 发表于 2015-1-7 19:20:15

下面是我摸索的百度FM获取歌曲的方法供大家参考一下,百度FM获取的音乐现在都是MP3格式的,还可以获取歌词:
1.http://fm.baidu.com利用chrome浏览器网页的源码最后面可以查看到rawChannelList的json结构,里面包含了channel_id名
2.使用 http://fm.baidu.com/dev/api/?tn=playlist&format=json&id=channel_id 可以获取当前频道的歌曲列表
3.使用http://music.baidu.com/data/music/fmlink?type=mp3&rate=320&songIds=歌曲ID可以获取歌曲的所有信息,包含歌曲地址,歌名 歌手等等
4.获取当前歌曲的歌词采用以下方法:
网址头:http://ting.baidu.com
/data2/lrc/13811641/13811641.lrc歌曲代码可以在第三步的歌曲信息中获取
完整的歌词url:http://ting.baidu.com/data2/lrc/13811641/13811641.lrc

fengxin32 发表于 2015-1-7 20:33:33

binaimei2007 发表于 2015-1-7 19:20
下面是我摸索的百度FM获取歌曲的方法供大家参考一下,百度FM获取的音乐现在都是MP3格式的,还可以获取歌词 ...

{:3_41:} 厉害,多谢了

besthc 发表于 2015-1-7 20:47:31

跟着大牛们一起学习

wmm20031015 发表于 2015-1-7 20:49:49

这个很有意思,关注

lxm 发表于 2015-1-7 21:04:05

心目中的大牛.

牙膏 发表于 2015-1-8 10:14:16

持续关注,跟着傻孩子一起学习

wdluo 发表于 2015-1-8 13:02:04

感觉挺有意思的,就是不知道硬件成本如何

chendong316 发表于 2015-1-11 17:11:37

建议还是用软解吧。硬解的话没有挑战性啊

kevin_me 发表于 2015-1-11 18:20:37

跟着傻孩子玩

liuruoshui 发表于 2015-1-11 18:50:51

不错,支持!

qianniao29 发表于 2015-1-11 19:33:15

厉害,期待新进展

Coobila 发表于 2015-1-11 20:48:52

关注,期待啊

小溪 发表于 2015-1-11 22:15:56

这么好的开源挑战,值得关注,必须支持!

快乐的小娃 发表于 2015-1-11 23:09:53

这个东西确实是个好东西,给力

brieve 发表于 2015-1-12 01:53:03

关注。

vivi_cq1982 发表于 2015-1-12 11:40:17

mark......

john_8 发表于 2015-1-12 12:08:18

学习一下,关注中

gyj82117 发表于 2015-1-12 12:23:39

占楼,占楼

mcuprogram 发表于 2015-1-12 12:55:03

紧密关注中                  

huangqi412 发表于 2015-1-12 16:05:26

把SD卡当下载缓冲用?

快乐的小娃 发表于 2015-1-12 22:51:53

之前公司有个同事弄过这个,传说很高大上,但是没机会仔细研究下,谢谢老大的资料

gonggu8181 发表于 2015-1-12 23:11:45

跟大牛多学习

ericdai 发表于 2015-1-13 00:04:00

用rt5350更合适吧

vows 发表于 2015-1-13 00:20:56

如果能一片esp8266解决网络和运算就牛逼了

mayou 发表于 2015-1-13 10:48:18

很大,很高啊

Gorgon_Meducer 发表于 2015-1-13 11:07:03

vows 发表于 2015-1-13 00:20
如果能一片esp8266解决网络和运算就牛逼了

那就需要有esp8266的SDK和IDE了。

yinglively 发表于 2015-1-13 11:13:02

这个要严重关注一下

NM2012 发表于 2015-1-13 12:07:41

这个必须支持

rossih 发表于 2015-1-13 13:23:03

emw1062貌似底层不开源啊?!

小黑鱼1148 发表于 2015-1-14 10:28:49

这个严重关注,很不错的呀,很好玩的样子

Gorgon_Meducer 发表于 2015-1-14 13:48:55

更新Vs10xx驱动

LK9286 发表于 2015-1-14 14:13:11

围观学习
页: [1] 2 3
查看完整版本: [交流][开源]豆瓣FM播放器嵌入式极限挑战(2015-2-04更新)