DDZZ669 发表于 2022-4-16 16:56

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

<p cid="n0" mdtype="paragraph">RVB2601板载wifi芯片W800,可以实现wifi连网,板载的喇叭,可以进行音乐播放。</p>

<p cid="n2" mdtype="paragraph">通过官方的webplayer例程,可以学习连网和音乐播放的使用。</p>

<p cid="n3" mdtype="paragraph">关于Yoc的开发文档:<a href="https://yoc.docs.t-head.cn/yocbook/">https://yoc.docs.t-head.cn/yocbook/</a></p>

<h1 cid="n4" mdtype="heading">1 连网</h1>

<h2 cid="n5" mdtype="heading">1.1 W800</h2>

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

<p cid="n7" mdtype="paragraph"></p>

<h2 cid="n8" mdtype="heading">1.2 连网配置</h2>

<p cid="n9" mdtype="paragraph">在init.c的网络初始化中,添加自己的wifi名称和密码,注意还要修改对应的字符串长度。</p>

<pre>
<code class="language-cpp">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, &amp;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);
 }
}</code></pre>

<p cid="n11" mdtype="paragraph">&nbsp;</p>

<h1 cid="n12" mdtype="heading">2 音乐播放</h1>

<p cid="n13" mdtype="paragraph">demo例程中,音乐的播放是通过命令行交互的方式,支持本地内存形式的音乐播放和网络URL形式的音乐播放。</p>

<pre>
<code class="language-cpp">static void cmd_ipc_func(char *wbuf, int wbuf_len, int argc, char **argv)
{
   if (argc == 3 &amp;&amp; strcmp(argv, "play") == 0)
    {
       char url;

       if (strcmp(argv, "welcom") == 0)
      {
           snprintf(url, sizeof(url), "mem://addr=%u&amp;size=%u", (uint32_t)&amp;_welcome_mp3, _welcome_mp3_len);
           player_play(get_player_demo(), url, 0);
     }
      else
      {
           player_play(get_player_demo(), argv, 0);
     }
 }
    else if (argc == 2 &amp;&amp; strcmp(argv, "stop") == 0)
    {
       player_stop(get_player_demo());
 }
    else if (argc == 2 &amp;&amp; strcmp(argv, "pause") == 0)
    {
       player_pause(get_player_demo());
 }
    else if (argc == 2 &amp;&amp; strcmp(argv, "resume") == 0)
    {
       player_resume(get_player_demo());
 }
    else if (argc == 3 &amp;&amp; strcmp(argv, "web") == 0)
    {
       g_url = strdup(argv);
       LOGD(TAG, "g_url = %s", g_url);
       aos_task_new("web_task", _webtask, NULL, 6*1024);
 }
    else
    {
       printf("\tplayer play welcom/url\n");
       printf("\tplayer pause\n");
       printf("\tplayer resume\n");
       printf("\tplayer stop\n");
       printf("\tplayer help");
 }
}</code></pre>

<p cid="n15" mdtype="paragraph">&nbsp;</p>

<h2 cid="n16" mdtype="heading">2.1 本地音乐播放</h2>

<p cid="n17" mdtype="paragraph">本地音乐播放,起始是将音乐存入代码中,播放音乐时从内存中读取数据。</p>

<p cid="n18" mdtype="paragraph">实例程序的的欢迎音乐,就是以数组的形式保存的,在welcome_mp3.h中:</p>

<pre>
<code class="language-cpp">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,
 ...</code></pre>

<p cid="n20" mdtype="paragraph">播放的时候调用player_play函数进行播放:</p>

<pre>
<code class="language-cpp">if (strcmp(argv, "welcom") == 0)
{
   snprintf(url, sizeof(url), "mem://addr=%u&amp;size=%u", (uint32_t)&amp;_welcome_mp3, _welcome_mp3_len);
   player_play(get_player_demo(), url, 0);
} </code></pre>

<h2 cid="n22" mdtype="heading">2.2 在线音乐播放</h2>

<p cid="n23" mdtype="paragraph">关于在线音乐的播放源,这篇中<a href="https://bbs.eeworld.com.cn/thread-1197096-1-1.html">https://bbs.eeworld.com.cn/thread-1197096-1-1.html</a>有一个:</p>

<pre>
<code>player play http://96.ierge.cn/15/235/471729.mp3</code></pre>

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

<h1 cid="n26" mdtype="heading">3 按键控制</h1>

<h2 cid="n27" mdtype="heading">3.1 按键配置</h2>

<p cid="n28" mdtype="paragraph">按键IO口初始化:</p>

<pre>
<code class="language-cpp">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(&amp;key1, PA11);
   csi_gpio_pin_dir(&amp;key1, GPIO_DIRECTION_INPUT);
   csi_gpio_pin_init(&amp;key2, PA12);
   csi_gpio_pin_dir(&amp;key2, GPIO_DIRECTION_INPUT);
    g_key1 = 0;
    g_key2 = 0;
}</code></pre>

<p cid="n30" mdtype="paragraph">&nbsp;</p>

<h2 cid="n31" mdtype="heading">3.2 按键控制音乐启动/暂停/继续</h2>

<p cid="n32" mdtype="paragraph">使用按键,可以控制音乐的播放,暂停和继续:</p>

<pre>
<code class="language-cpp">#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(&amp;key1))
    {
      //持续按键置标志
      if(g_key1)
      {
            g_key1 |= 0x40;
      }
      else
      {
            g_key1 = 1;
      }
    }
    //持续按键后释放
    else if(g_key1 &amp; 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(&amp;key2))
    {
      if(g_key2)
      {
            g_key2 |= 0x40;
      }
      else
      {
            g_key2 = 1;
      }
    }
    else if(g_key2 &amp; 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;
    }
}</code></pre>

<p cid="n34" mdtype="paragraph">在主函数中,需要新建一个按键任务,来进行按键的检测:</p>

<pre>
<code class="language-cpp">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;
}</code></pre>

<h1 cid="n36" mdtype="heading">4 测试</h1>

<p cid="n37" mdtype="paragraph">通过板子上按键控制音乐播放、暂停、继续的测试效果如下:</p>

<p cid="n38" mdtype="paragraph"><iframe __idm_id__="688129" allowfullscreen="true" frameborder="0" height="450" src="//player.bilibili.com/player.html?bvid=18u411v765&amp;page=1" style="background:#eee;margin-bottom:10px;" width="700"></iframe><br />
&nbsp;</p>

<p cid="n39" mdtype="paragraph">&nbsp;</p>

<h1 cid="n40" mdtype="heading">5 总结</h1>

<p cid="n41" mdtype="paragraph">本篇介绍了如何使用RVB2601自带的W800进行连网以及使用按键控制音乐播放、暂停与继续</p>

<p cid="n42" mdtype="paragraph">&nbsp;</p>

<p cid="n43" mdtype="paragraph">&nbsp;</p>

lugl4313820 发表于 2022-4-16 17:37

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

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

anthpo 发表于 2022-4-16 17:44

<p>支持支持!<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" /></p>

wangerxian 发表于 2022-4-17 07:56

<p>这个不错,在线音乐播放器!本地的估计不好弄,内存太小,要是能插SD卡就好了!</p>
页: [1]
查看完整版本: 【平头哥RVB2601创意应用开发】实践4-按键控制网络音乐播放