[交流][开源]豆瓣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驱动
第一版硬件原理图
占楼,占楼 本帖最后由 gzhuli 于 2015-1-4 23:41 编辑
沙发~
这个真是挑战自我了,话说09年RT-Thread就在STM32F103上实现了MP3软解和豆瓣FM在线播放,今天再搞这个的话还是树莓派比较有实用价值。 学习,mark。。。。 学习一下 很有意思,关注中 围观,围观 排队学习 学习一下。努力让自己多学点知识。 学习学习!!! 马克 一直想加入傻孩子的助手行列,可惜工作忙得没心情 关注中加油 关注!很是期待。 靠!激动的说不出话啊 感兴趣,关注中 Hardware Design的id一看就是牛人{:titter:} 曾经做过类似的东西。关注楼主。。。 值得学习的项目,09年左右当是想使用LM3S做一个这样的,板子都做回来了,但是没有时间调试,一直放哪儿了 支持一下 跟大师学习了! 非常有激情啊 关注
学习。
关注学习中,这个项目挺有意思的 占座。
学习。 前排占座,学习一下 这个喜欢。很有意思 我发现豆瓣FM电台放的歌曲都是不停重复的,每个分类的曲库就那么几十首歌,播完又重新循环,好久都不更新的,挺多了就不想再听了,这个要如何是好? 关注学习 关注,有空打板做一个,没做过M3+WIFI,跟做一个学习一下, 关注,搬登子 值得学习 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) 关注。豆瓣FM 还是第一次听说。 跟大师学习。。。。真心不错 支持傻孩子的开源。。。{:victory:} jiaowoxiaolu 发表于 2015-1-5 08:49
我发现豆瓣FM电台放的歌曲都是不停重复的,每个分类的曲库就那么几十首歌,播完又重新循环,好久都不更新的 ...
有红星歌曲就会很不同了 关注期待各位的大作 支持啊!好象野火的教程里也有一个关于播放豆瓣音乐的教程! 顶顶顶{:lol:} 有意思啊 支持,学习一下 顶一下。顺便看看某些解决方法。 排队 学习 gzhuli 发表于 2015-1-4 23:38
沙发~
这个真是挑战自我了,话说09年RT-Thread就在STM32F103上实现了MP3软解和豆瓣FM在线播放,今天再搞 ...
团队开会选项目的时候,我还没来得及说啥,大家就决定做这个了。本来团队的初衷就是做大家觉得好玩的东西,所以就这么决定了,至于实用价值,中间很多产物的价值都高于这个项目的功能本身。这次是裸奔,所以和TR-Thread环境还是很不同的。 排队学习,很好玩啊 关注,学习一下。 围观围观! 好久不见版主大人了哦!
项目附带的编程模式,系统调度,界面编制等等都值得期待哦! Gorgon_Meducer 发表于 2015-1-5 09:22
团队开会选项目的时候,我还没来得及说啥,大家就决定做这个了。本来团队的初衷就是做大家觉得好玩的东西 ...
嗯,其实这种项目最主要的功能就是验证系统架构思路。 帮凳子,学习。 gzhuli 发表于 2015-1-5 16:33
嗯,其实这种项目最主要的功能就是验证系统架构思路。
是啊,估计这也是为什么他们挑选这个作为入手点的原因。如果是我选,多半会做GUI之类的。 关注楼主。。。 好像豆瓣音乐的歌现在大部分都是MP4格式,AAC压缩的 持续关注,不知这种wifi模块价格如何 本帖最后由 Gorgon_Meducer 于 2015-1-5 19:35 编辑
binaimei2007 发表于 2015-1-5 17:10
好像豆瓣音乐的歌现在大部分都是MP4格式,AAC压缩的
Vx1053支持AAC,不担心 好东西,跟上!! 围观楼主 经常听豆瓣FM,这个真心好!~~ 顶,喜欢这种原始的方式。
用单片ESP8266试试看,比较好玩 嗯,8266内部跑的就是lwip 网络收音机?和服务器的协议比较麻烦,播放MP3对这个论坛的人来说难度不大,尤其是还有解码芯片…… 楼主哥哥 , 你的新书写完了没? 支持傻孩子=-= 都太厉害啦 P.s 期待楼主新书啊 更新数据流图 强烈支持老大事业 fengxin32 发表于 2015-1-5 22:45
网络收音机?和服务器的协议比较麻烦,播放MP3对这个论坛的人来说难度不大,尤其是还有解码芯片…… ...
做出来的确难度不是特大。如果是在小资源的片子上实现就有点难度了。 下面是我摸索的百度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 binaimei2007 发表于 2015-1-7 19:20
下面是我摸索的百度FM获取歌曲的方法供大家参考一下,百度FM获取的音乐现在都是MP3格式的,还可以获取歌词 ...
{:3_41:} 厉害,多谢了 跟着大牛们一起学习 这个很有意思,关注 心目中的大牛. 持续关注,跟着傻孩子一起学习 感觉挺有意思的,就是不知道硬件成本如何 建议还是用软解吧。硬解的话没有挑战性啊 跟着傻孩子玩 不错,支持! 厉害,期待新进展 关注,期待啊 这么好的开源挑战,值得关注,必须支持! 这个东西确实是个好东西,给力 关注。 mark...... 学习一下,关注中 占楼,占楼 紧密关注中 把SD卡当下载缓冲用? 之前公司有个同事弄过这个,传说很高大上,但是没机会仔细研究下,谢谢老大的资料 跟大牛多学习 用rt5350更合适吧 如果能一片esp8266解决网络和运算就牛逼了 很大,很高啊 vows 发表于 2015-1-13 00:20
如果能一片esp8266解决网络和运算就牛逼了
那就需要有esp8266的SDK和IDE了。 这个要严重关注一下 这个必须支持 emw1062貌似底层不开源啊?! 这个严重关注,很不错的呀,很好玩的样子 更新Vs10xx驱动 围观学习