[经验分享] 【平头哥RVB2601创意应用开发】实践4-按键控制网络音乐播放

DDZZ669   2022-4-16 16:56 楼主

RVB2601板载wifi芯片W800,可以实现wifi连网,板载的喇叭,可以进行音乐播放。

通过官方的webplayer例程,可以学习连网和音乐播放的使用。

关于Yoc的开发文档:https://yoc.docs.t-head.cn/yocbook/

1 连网

1.1 W800

W800芯片是一款安全IoT Wi-Fi/蓝牙双模 SoC 芯片。支持 2.4G IEEE802.11b/g/n Wi-Fi 通讯协议;支持 BT/BLE 双模工作模式,支持 BT/BLE4.2 协议。芯片采用平头哥玄铁804(32位)CPU内核,最高主频达到240MHz;内置TEE安全引擎,为芯片提供了高性能的核心处理能力及安全可信的执行环境。

1.png

1.2 连网配置

在init.c的网络初始化中,添加自己的wifi名称和密码,注意还要修改对应的字符串长度。

static void network_init()
{
    w800_wifi_param_t w800_param;
    /* init wifi driver and network */
    w800_param.reset_pin      = PA21;
    w800_param.baud           = 1*1000000;
    w800_param.cs_pin         = PA15;
    w800_param.wakeup_pin     = PA25;
    w800_param.int_pin        = PA22;
    w800_param.channel_id     = 0;
    w800_param.buffer_size    = 4*1024;
​
    wifi_w800_register(NULL, &w800_param);
    app_netmgr_hdl = netmgr_dev_wifi_init();
​
    if (app_netmgr_hdl) {
        utask_t *task = utask_new("netmgr", 2 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI);
        netmgr_service_init(task);
        netmgr_config_wifi(app_netmgr_hdl, "MERCURY_3394", 12, "xxxxxxxxxxx", 11);//自己的WIFI名称和密码
        netmgr_start(app_netmgr_hdl);
    }
}

 

2 音乐播放

demo例程中,音乐的播放是通过命令行交互的方式,支持本地内存形式的音乐播放和网络URL形式的音乐播放。

static void cmd_ipc_func(char *wbuf, int wbuf_len, int argc, char **argv)
{
    if (argc == 3 && strcmp(argv[1], "play") == 0) 
    {
        char url[128];
​
        if (strcmp(argv[2], "welcom") == 0) 
        {
            snprintf(url, sizeof(url), "mem://addr=%u&size=%u", (uint32_t)&_welcome_mp3, _welcome_mp3_len);
            player_play(get_player_demo(), url, 0);
        } 
        else 
        {
            player_play(get_player_demo(), argv[2], 0);
        }
    } 
    else if (argc == 2 && strcmp(argv[1], "stop") == 0) 
    {
        player_stop(get_player_demo());
    } 
    else if (argc == 2 && strcmp(argv[1], "pause") == 0) 
    {
        player_pause(get_player_demo());
    } 
    else if (argc == 2 && strcmp(argv[1], "resume") == 0) 
    {
        player_resume(get_player_demo());
    } 
    else if (argc == 3 && strcmp(argv[1], "web") == 0) 
    {
        g_url = strdup(argv[2]);
        LOGD(TAG, "g_url = %s", g_url);
        aos_task_new("web_task", _webtask, NULL, 6*1024);
    } 
    else 
    {
        printf("\tplayer play welcom/url[http://]\n");
        printf("\tplayer pause\n");
        printf("\tplayer resume\n");
        printf("\tplayer stop\n");
        printf("\tplayer help");
    }
}

 

2.1 本地音乐播放

本地音乐播放,起始是将音乐存入代码中,播放音乐时从内存中读取数据。

实例程序的的欢迎音乐,就是以数组的形式保存的,在welcome_mp3.h中:

const unsigned char _welcome_mp3[] = {
    0xff, 0xf3, 0x88, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x58, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
    0x5d, 0x00, 0x00, 0x59, 0x94, 0x00, 0x00, 0x03, 0x06, 0x09, 0x0d, 0x12,
    0x15, 0x17, 0x19, 0x1b, 0x1d, 0x20, 0x22, 0x25, 0x25, 0x27, 0x2b, 0x2e,
    0x31, 0x34, 0x36, 0x38, 0x3b, 0x3d, 0x3f, 0x42, 0x45, 0x47, 0x47, 0x49,
    0x4c, 0x50, 0x55, 0x5a, 0x5d, 0x60, 0x63, 0x65, 0x68, 0x6a, 0x6c, 0x6e,
    ...

播放的时候调用player_play函数进行播放:

if (strcmp(argv[2], "welcom") == 0) 
{
    snprintf(url, sizeof(url), "mem://addr=%u&size=%u", (uint32_t)&_welcome_mp3, _welcome_mp3_len);
    player_play(get_player_demo(), url, 0);
} 

2.2 在线音乐播放

关于在线音乐的播放源,这篇中https://bbs.eeworld.com.cn/thread-1197096-1-1.html有一个:

player play http://96.ierge.cn/15/235/471729.mp3

这篇中https://bbs.eeworld.com.cn/thread-1199186-1-1.html,介绍了如何生成任意音乐的播放源,不过实测生成的播放源过一段时间会失效,临时测试还是很不错的。

3 按键控制

3.1 按键配置

按键IO口初始化:

static csi_gpio_pin_t key1;
static csi_gpio_pin_t key2;
​
volatile uint8_t g_key1;
volatile uint8_t g_key2;
​
void key_pinmux_init(void)
{
    csi_pin_set_mux(PA11, PIN_FUNC_GPIO);
    csi_pin_set_mux(PA12, PIN_FUNC_GPIO);
​
    csi_gpio_pin_init(&key1, PA11);
    csi_gpio_pin_dir(&key1, GPIO_DIRECTION_INPUT);
    csi_gpio_pin_init(&key2, PA12);
    csi_gpio_pin_dir(&key2, GPIO_DIRECTION_INPUT);
    g_key1 = 0;
    g_key2 = 0;
}

 

3.2 按键控制音乐启动/暂停/继续

使用按键,可以控制音乐的播放,暂停和继续:

#define URL_GUYONGZHE "http://m801.music.126.net/20220411005827/8b3af711ffd5c3f2ac24ae19fcd027a5/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/11983356173/ed2f/6024/be41/2dc456563c5f9c9535b75ecb066c0325.mp3"
​
void key_loop(void)
{
    static bool isPause = false;
    if(GPIO_PIN_LOW == csi_gpio_pin_read(&key1)) 
    {
        //持续按键置标志
        if(g_key1) 
        {
            g_key1 |= 0x40;
        }
        else 
        {
            g_key1 = 1;
        }
    }
    //持续按键后释放
    else if(g_key1 & 0x40)
    {
        LOGD(TAG, "\n===key1=%d, %s, %d\n", g_key2, __FUNCTION__, __LINE__);
        g_key1=0x80;
        
        if (!isPause)
        {
            player_pause(get_player_demo());
            isPause = true;
        }
        else
        {
            player_resume(get_player_demo());
            isPause = false;
        }
    }
    else 
    {
        g_key1 = 0;
    }
    
    if(GPIO_PIN_LOW == csi_gpio_pin_read(&key2)) 
    {
        if(g_key2)
        {
            g_key2 |= 0x40;
        }
        else 
        {
            g_key2 = 1;
        }
    }
    else if(g_key2 & 0x40)  
    {
        LOGD(TAG, "\n===key2=%d, %s, %d\n", g_key2, __FUNCTION__, __LINE__);
        g_key2=0x80;
        
        //player_play(get_player_demo(), "http://96.ierge.cn/15/235/471729.mp3", 0);
        player_play(get_player_demo(), URL_GUYONGZHE, 0);
    }
    else 
    {
        g_key2 = 0;
    }
}

在主函数中,需要新建一个按键任务,来进行按键的检测:

static void key_task(void *arg)
{
    key_pinmux_init();
​
    while (1)
    {
        aos_msleep(5);
        key_loop();
    }
}
​
int main(void)
{
    board_yoc_init();
​
    player_init();
​
    cli_reg_cmd_player();
    
    /* Subscribe */
    event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);
    event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);
    
    //按键检测任务
    aos_task_new("key", key_task, NULL, 10*1024);
    
    return 0;
}

4 测试

通过板子上按键控制音乐播放、暂停、继续的测试效果如下:


 

 

5 总结

本篇介绍了如何使用RVB2601自带的W800进行连网以及使用按键控制音乐播放、暂停与继续

 

 

回复评论 (3)

6666,如果加上OLED,显示状态,那不是完㺯了!

本帖最后由 lugl4313820 于 2022-4-16 17:38 编辑
点赞  2022-4-16 17:37

支持支持!

点赞  2022-4-16 17:44

这个不错,在线音乐播放器!本地的估计不好弄,内存太小,要是能插SD卡就好了!

点赞  2022-4-17 07:56
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复