【开源获奖案例】基于T5L智能屏的音乐播放与歌词显示方案

——来自迪文开发者论坛

本期为大家推送迪文开发者论坛获奖开源案例——基于T5L智能屏的音乐播放与歌词显示方案。该方案通过T5L串口与通用开发板、解码板进行数据交互,将解析完成的音频和歌词通过串口发送给智能屏,实现音乐播放、歌词显示、歌曲播放进度控制等功能,为用户打造流畅的视听体验。


【演示视频】

完整开发资料含迪文屏DGUS工程资料与C51代码,获取方式

前往迪文开发者论坛获取:http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=12151

微信公众号中回复“音乐播放与歌词显示”获取。

【GUI工程设计】

GUI


【C51工程设计】

(1)T5L智能屏代码如下:   

INIT_CPU();//系统初始化

PORT_Init();//IO口初始化

T0_Init();//定时器0初始化

//     T1_Init();

T2_Init();//定时器2初始化

//     WDT_ON();//打开开门狗 喂狗在定时器T2中

my_UART4_Init(115200);

uart_init();//串口初始化

void MainMachineHandle(void)

{

    if(UartDataHandle)

    {

        uartHandle(Uart4_Rx,uart4_rx_count);

        CLR_UartMp3();

    }

}


(2)图形剪切函数代码如下


void VolCutDisp(VolCutDispLog_Para_s *Para)

{

    u8data WriteBuff[10][2];

    u8VolC=0;

    u16Endaddrx=0;

    VolC=Para->Vol;

    memset(WriteBuff,0,sizeof(WriteBuff));

    WriteBuff[0][1]=6;//固定

    WriteBuff[1][1]=1;//固定

    WriteBuff[2][1]=Para->CutPage;//音量条所在页面

    WriteBuff[3][0]=Para->CutbegXY[0]>>8;//开始地址 X

    WriteBuff[3][1]=Para->CutbegXY[0]&0xff;//X

    WriteBuff[4][0]=Para->CutbegXY[1]>>8;//Y

    WriteBuff[4][1]=Para->CutbegXY[1]&0xff;//Y

    Endaddrx=Para->CutbegXY[0]+VolC*0.01*Para->LogoLen;//结束地址

    WriteBuff[5][0]=Endaddrx>>8;//X

    WriteBuff[5][1]=Endaddrx&0xff;//X

    WriteBuff[6][0]=Para->CutendXY[1]>>8;//Y

    WriteBuff[6][1]=Para->CutendXY[1]&0xff;//Y

    WriteBuff[7][0]=Para->localPageXY[0]>>8;

    WriteBuff[7][1]=Para->localPageXY[0]&0xff;

    WriteBuff[8][0]=Para->localPageXY[1]>>8;

    WriteBuff[8][1]=Para->localPageXY[1]&0xff;

    WriteBuff[9][1]=0XFF;

    write_dgusii_vp(Para->CutDispaddr,WriteBuff[0],10);

}

void UpanPlaySliderLogo(void)

{

    staticu8 VolC=102;

    u8data Readdtata[2];

    VolCutDispLog_Para_sUpanPlayLog;

    if(NowPage[1]!=4)

    {

        VolC=0x102;

        return;

    }

    Read_Dgusii_Vp(0x17B8,Readdtata,1);

    if(VolC==Readdtata[1])

    return;

    VolC=Readdtata[1];

    UpanPlayLog.LogoLen=459;//长度

    UpanPlayLog.CutPage=13;//剪切图形所在页面

    UpanPlayLog.CutDispaddr=0x8000;//基本图形地址

    UpanPlayLog.Vol=VolC;//0~100音量值

    UpanPlayLog.CutbegXY[0]=160;//剪切图形左上角开始地址X

    UpanPlayLog.CutbegXY[1]=386;//剪切图形左上角开始地址Y

    UpanPlayLog.CutendXY[0]=619;//剪切图形右下角开始地址X

    UpanPlayLog.CutendXY[1]=398;//剪切图形右下角结束地址Y

    UpanPlayLog.localPageXY[0]=160;

    UpanPlayLog.localPageXY[1]=386;

    VolCutDisp(&UpanPlayLog);

}


(3)通用开发板代码如下:

void LoopHandle_task(void *p_arg)

{

    delay_ms(1000);

    Init_Mp3data();

    DMT_ChangePage(1);

    while (1) 

    {

        LCD_Handle();

        Mp3PlayProcess();

        UdiskDisInOut();

        vTaskDelay(LoopHandle_ms / portTICK_PERIOD_MS);

    }

}

void LCD_Handle(void)

{

    DMT_Action1();                   // 循环检测屏幕上是否有数据发生改变

    Mp3SongSchedUp();                // MP3播放的进度条

    USB_PlayDispSongName();          // 歌曲名称更新

    MusicPlayLysic();                // 更新歌曲名称

}


(4)歌词显示代码如下

void MusicPlayLysic(void)

{

    static u16 counttime = 0;

    static u8 nolrc = 0;

    static u16 crc1 = 0, crc2 = 0;

    u16 crcb1 = 0, crcb2 = 0;

    // static u8 updataLysci = 0;

    u8 ReadBufout1[64][2];

    u8 ReadBufout2[64][2];

    u8 ReadBufin1[32][2];

    u8 ReadBufin2[32][2];

    if (DmtDataBuf[MPageid][1] != 4) 

    {

        counttime = 0;

        crc1 = 0;

        crcb2 = 0;

        nolrc = 0;

        return;

    }

    if (DmtDataBuf[MMp3Lrcaddr][1]) 

    {

        nolrc = 0;

        crcb1 = CalcCrcAll(0xffff, DmtDataBuf[MMp3LrcReadaddr], 64);

        crcb2 = CalcCrcAll(0xffff, DmtDataBuf[MMp3LrcReadaddr + 32], 64);

        if (crcb1 != crc1 || crc2 != crcb2) 

        {

            crc1 = crcb1;

            crc2 = crcb2;

            memset(ReadBufout1, 0, sizeof(ReadBufout1));

            memset(ReadBufout2, 0, sizeof(ReadBufout2));

            memset(ReadBufin1, 0, sizeof(ReadBufin1));

            memset(ReadBufin2, 0, sizeof(ReadBufin2));

            memcpy(ReadBufin1, DmtDataBuf[MMp3LrcReadaddr], 64);

            memcpy(ReadBufin2, DmtDataBuf[MMp3LrcReadaddr + 32], 64);

//          All_unicodeToUtf(ReadBufin1,

//                             (u8 *)ReadBufout1,MusicLysicDoubleNULL(ReadBufin1,64));

//          All_unicodeToUtf(ReadBufin2,

//                             (u8 *)ReadBufout2,MusicLysicDoubleNULL(ReadBufin2,64));

            UnicodeToGbk((u16*)ReadBufin1,

                         (u16 *)ReadBufout1,MusicLysicDoubleNULL((char*)ReadBufin1,64));

            UnicodeToGbk((u16*)ReadBufin2,

                         (u16 *)ReadBufout2,MusicLysicDoubleNULL((char*)ReadBufin2,64));

//          ShuangYu_UTF_DispLysic(lv_label_get_text(lv_SY_UTF_top->songname),ReadBufout1,ReadBufout2);                    

            DMT_WriteLen(0x7100, ReadBufout1[0], 32, 1);

            DMT_WriteLen(0x7120, ReadBufout2[0], 32, 1);

        }

    }

    elseif(nolrc==0)

    {

        nolrc=1;

        crc1=0;

        crcb2=0;

        DMT_WriteLen(0x7100,"无",2,1);

        ClearDGUSIIMemory(32,0x7120);

//          ShuangYu_UTF_DispLysic(lv_label_get_text(lv_SY_UTF_top->songname),"无"," ");              

    }

}


(5)解码板代码如下:

void WritecmdHandle(void)

{

    ChangeModeTask();

    SysVolSetting();

    BT_PlayPreNextPPSong();

    PlayModeFun();

    DirsclustReadSong();

    PlaySclustSong();

    UserTWS_Oper();

    BreakSavePlay();

    ClearTwsTransData();

    TwsTransData();

    BtLinkOper();

    SYS_Reset();

}

bool lrc_ui_show(int text_id, u8encode_type, u8 *buf, int len, u8 lrc_show_flag, u8 lrc_update)

{

#if 1//(CONFIG_UI_STYLE ==STYLE_JL_SOUNDBOX)

    staticint disp_len = 0;

    staticu8 lrc_showbytes = 0;

    staticu8 offset = 0;

    if(lrc_update) 

    {

        disp_len= len;

        lrc_showbytes= 0;

        offset= 0;

        //ui_text_set_text_by_id(LRC_TEXT_ID_SEC, "", 16, FONT_DEFAULT);

    }

    if(lrc_show_flag == 1) 

    {

        printf("encode_type:%d\r\n",encode_type);

        printf("id:%02d,%s\r\n",text_id,buf);//这里是显示歌曲 gbk编码

        ModReadReg[RD_SongLysicOn][0]=encode_type;

        if(text_id<2)

        {

            memset(ModReadReg[RD_MusicLy1+text_id*32],0,64);

            GbkToUnicode(buf,ModReadReg[RD_MusicLy1+text_id*32],32);

            //strcpy(ModReadReg[RD_MusicLy1+text_id],buf);

        }

        //log_info_hexdump(buf,len);

    }

#endif

     returntrue;

}