硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2579|回复: 9
收起左侧

请教下,播放flac音乐时,屏幕有干扰,是怎么回事啊 ?

[复制链接]

680

主题

3479

回帖

5544

积分

论坛元老

积分
5544
发表于 2017-9-19 20:05:38 | 显示全部楼层 |阅读模式
请教下,播放flac音乐时,屏幕有干扰,是怎么回事啊 ?
刚开始时貌似有地方卡住了的感觉,会发出卡卡卡的使用,但是过一会就好了,声音就正常播放了,只是屏幕有干扰发生,不知道是怎么情况 ???
播放部分代码如下:

int flac_play_song(char* path)
{
  FLACContext fc;
  int fd;
  int n;            
  int bytesleft;
  int consumed;
  char tmp[20];
  static volatile int8_t i;
  unsigned char *filebuf;
  unsigned short *temp_buffer;
  char value=0;
  uint8_t res;
  int16_t *PCM_buffer0=0;
  int16_t *PCM_buffer1=0;
  uint8_t *p8;
  UINT br;
  u32 flac_fptr=0;


  char PlayAddr[100] = {0};
  strcpy(PlayAddr, (const char *)path);  

  audiodev.file = (FIL*)mymalloc(SRAMDTCM,sizeof(FIL));


  res=f_open(audiodev.file,(char*)PlayAddr,FA_READ); //读取文件错误   

  if(res!=FR_OK)
  {
    myfree(SRAMDTCM, audiodev.file);
    return 0xff;
  }

  flacctrl      = mymalloc(SRAMDTCM,sizeof(__flacctrl));

  /* Read the metadata and position the file pointer at the start of the
   first audio frame */

  flac_init(audiodev.file,  flacctrl,  &fc);

    dump_headers(&fc);

    f_lseek (audiodev.file , audiodev.file->fptr);

    printf("波特率:%dKbps\n\r\n",fc.bitrate);

    printf("采样率:%d\n\r\n",fc.samplerate);

    if (fc.length/1000%60>=10)

    printf("总时间:%d:%d\n\r\n",fc.length/1000/60, fc.length/1000%60);
    else
    printf(tmp,"总时间:%d:0%d\n\r\n",fc.length/1000/60, fc.length/1000%60);

    printf("块大小:%d\n\r\n",fc.max_blocksize);

    PCM_buffer0 = (int16_t *)mymalloc(SRAMEX,MAX_BLOCKSIZE * MAX_CHANNELS * 2);
    PCM_buffer1 = (int16_t *)mymalloc(SRAMEX,MAX_BLOCKSIZE * MAX_CHANNELS * 2);
    filebuf = (uint8_t *)mymalloc(SRAMEX,MAX_FRAMESIZE * 2);    //内存分配.


    if (filebuf==NULL)
    {
        printf("\n\r no mem!!\n\r\n");
        goto fail;
    }
    temp_buffer= (unsigned short *)mymalloc(SRAMEX,MAX_FRAMESIZE * MAX_CHANNELS * 2);    //内存分配.

    if((fc.min_blocksize != fc.max_blocksize) || (fc.max_blocksize > MAX_BLOCKSIZE ) || (fc.max_framesize > MAX_FRAMESIZE))
    {
        printf("\n\rOo Do not support this file!!\n\r\n");
        printf("You can choose another Converter.Such as foobar2000 ^_^\n\r\n");
        goto fail;
    }

    audiodev.i2sbuf1 = (uint8_t *)PCM_buffer0;
    audiodev.i2sbuf2 = (uint8_t *)PCM_buffer1;

    FLAC_Stop();  
    FLAC_EnterPlayMode();    //进入播放模式
    FLAC_SaiConfInit(flacctrl->bps, flacctrl->samplerate, flacctrl->outsamples);

    __LTDC_drv->LTDC_DispStringAt(5, 375, LCD_COLOR_BLUE,               //显示当前播放的 .wav文件名字      
                              LCD_COLOR_WHITE,
                              &FontAscii8x16,
                              (const uint8_t *)PlayAddr);   

        f_read(audiodev.file,filebuf,MAX_FRAMESIZE,&br);//读取最大帧长数据        
        bytesleft = br;

        flac_fptr = audiodev.file->fptr;    //记录当前的文件位置.
    FLAC_Start();                    //开始播放      

    while (bytesleft)
    {

      while(audiodev.AudioTransferEnd==0)//等待传输完成
            {
            };     


      audiodev.AudioTransferEnd=0;  

            if(audiodev.AudioSwitchBuf == 0)
      {
        p8 = audiodev.i2sbuf1;
      }
            else
      {
        p8 = audiodev.i2sbuf2;  
      }

      fc.decoded0 = (int32_t *)p8;
      fc.decoded1 = (int32_t *)temp_buffer;        

       flac_decode_frame(&fc,filebuf,bytesleft,(int16_t *)p8);

        consumed=fc.gb.index/8;
        rt_memmove(filebuf,&filebuf[consumed],bytesleft-consumed);
        bytesleft-=consumed;

        f_read(audiodev.file, &filebuf[bytesleft],MAX_FRAMESIZE-bytesleft, &br);        

        if (br > 0)
        {
            bytesleft+=br;
        }         


        flac_fptr=audiodev.file->fptr;    //记录当前的文件位置.
        while(audiodev.status&(1<<1))    //正常播放中
        {         
          FLAC_MsgShow(audiodev.file); //得到总时间和当前播放的时间
          audiodev.totsec=flacctrl->totsec;        //参数传递
          audiodev.cursec=flacctrl->cursec;
          audiodev.bitrate=flacctrl->bitrate;
          audiodev.samplerate=flacctrl->samplerate;
          audiodev.bps=flacctrl->bps;   

            if(audiodev.status&0X01)break;    //没有按下暂停
        //    else
        //    HAL_Delay(5);    // delay_ms(1000/OS_TICKS_PER_SEC);

        }
        if((audiodev.status&(1<<1))==0)        //请求结束播放/播放完成
        {  
          break;
        }        
    }


fail:

     Getmemtablestatus(); //获取内存块状态


   f_close(audiodev.file);
   myfree(SRAMDTCM,audiodev.file);
   myfree(SRAMDTCM,flacctrl);
        myfree(SRAMEX,PCM_buffer0);
      myfree(SRAMEX,PCM_buffer1);   
      myfree(SRAMEX,filebuf);
        myfree(SRAMEX,temp_buffer);   

    return value;
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115653
QQ
发表于 2017-9-20 00:38:33 | 显示全部楼层
这个不太清楚哦,做这种音乐播放的时候,特别注意框架设计,框架设计的好,随意倒腾都不会有问题。

可以参考我搞的MP3的:http://www.armbbs.cn/forum.php?m ... 687&fpage=4
回复

使用道具 举报

680

主题

3479

回帖

5544

积分

论坛元老

积分
5544
 楼主| 发表于 2017-9-21 09:13:06 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个不太清楚哦,做这种音乐播放的时候,特别注意框架设计,框架设计的好,随意倒腾都不会有问题。

可以参考我搞的MP3的:http://www.armbbs.cn/forum.php?m ... 687&fpage=4 (2017-09-20 00:38) 
多谢多谢,我去看看
回复

使用道具 举报

680

主题

3479

回帖

5544

积分

论坛元老

积分
5544
 楼主| 发表于 2017-9-25 22:34:58 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个不太清楚哦,做这种音乐播放的时候,特别注意框架设计,框架设计的好,随意倒腾都不会有问题。

可以参考我搞的MP3的:http://www.armbbs.cn/forum.php?m ... 687&fpage=4 (2017-09-20 00:38)
按照你的历程修改了,结果也还是一样的啊,

具体效果你可以看看这个视频

http://v.youku.com/v_show/id_XMz ... j.8428770.3416059.1

播放其他的 wav, mp3 都是完全没有任何问题的,而且只要不播放 flac ,显示完全正常
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115653
QQ
发表于 2017-9-26 10:33:36 | 显示全部楼层

回 hpdell 的帖子

hpdell:按照你的历程修改了,结果也还是一样的啊,

具体效果你可以看看这个视频

....... (2017-09-25 22:34) 
参考这个,群友在我们的例子基础上添加的FLAC和APE
http://www.armbbs.cn/forum.php?mod=viewthread&tid=26163
回复

使用道具 举报

680

主题

3479

回帖

5544

积分

论坛元老

积分
5544
 楼主| 发表于 2017-9-26 22:02:58 | 显示全部楼层

回 eric2013 的帖子

eric2013:参考这个,群友在我们的例子基础上添加的FLAC和APE
http://www.armbbs.cn/forum.php?mod=viewthread&tid=26163 (2017-09-26 10:33) 
你好,我刚刚把 优化基本设置为最高貌似就可以了,

播放 flac 的文件屏幕不闪,但是 播放完后不能够播放其他 类型的 音乐文件了,

我的编译器使用的 是  iar

这个问题是不是说明 这个 flac 的库文件有些指针写的不支持 iar 编译器啊 ?

或者是需要修改哪里 ??
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115653
QQ
发表于 2017-9-28 08:49:04 | 显示全部楼层

回 hpdell 的帖子

hpdell:你好,我刚刚把 优化基本设置为最高貌似就可以了,

播放 flac 的文件屏幕不闪,但是 播放完后不能够播放其他 类型的 音乐文件了,

....... (2017-09-26 22:02)
这个应该是你的程序问题了。音频的切换设计有问题。
回复

使用道具 举报

680

主题

3479

回帖

5544

积分

论坛元老

积分
5544
 楼主| 发表于 2017-9-28 12:31:08 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个应该是你的程序问题了。音频的切换设计有问题。
 (2017-09-28 08:49) 
我使用移植 keil 里面的工程 到 iar 上的,估计有可能他们有些地方不兼容造成的,有没有这个可能啊 ??
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115653
QQ
发表于 2017-9-29 09:19:17 | 显示全部楼层

回 hpdell 的帖子

hpdell:我使用移植 keil 里面的工程 到 iar 上的,估计有可能他们有些地方不兼容造成的,有没有这个可能啊 ??

 (2017-09-28 12:31) 
可能有,估计概率比较小些,可以的话,在MDK上面也搞下。
回复

使用道具 举报

680

主题

3479

回帖

5544

积分

论坛元老

积分
5544
 楼主| 发表于 2017-10-4 21:56:36 | 显示全部楼层

回 eric2013 的帖子

eric2013:

可能有,估计概率比较小些,可以的话,在MDK上面也搞下。

你好,我在 keil 编译器下测试也还是会出现显示闪烁的情况,但是我使用的 flac 库跟你们的历程库一样啊,

也不知道是怎么个情况 ??

最终的解决方法是 把 优化基本搞到最高就可以了,另外把音频内存都搞成单片机内部的 ram内存了,貌似不能够使用外部的sdram,这个说明什么情况啊 ????

是我的外部 sdram 走线不好 ??
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-10 06:50 , Processed in 0.251034 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表