你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
hpdell 提问时间:2017-9-19 20:04 /
本帖最后由 hpdell 于 2017-9-25 22:42 编辑

请教下,播放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;
}

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

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

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


收藏 评论11 发布时间:2017-9-19 20:04

举报

11个回答
MrJiu 回答时间:2017-9-20 09:41:54
有干扰?是闪烁?屏幕是什么接口方式?
hpdell 回答时间:2017-9-24 22:36:32
MrJiu 发表于 2017-9-20 09:41
有干扰?是闪烁?屏幕是什么接口方式?

rgb接口的,但是播放ape,wav等音频屏幕显示非常好,就唯独这个 flac 音频就不行,估计应该是什么地址搞错了,但是具体的也不清楚到底是哪里出了问题,播放 flac 音频时,声音貌似还可以
MrJiu 回答时间:2017-9-25 09:00:55
hpdell 发表于 2017-9-24 22:36
rgb接口的,但是播放ape,wav等音频屏幕显示非常好,就唯独这个 flac 音频就不行,估计应该是什么地址搞错 ...

你这里的屏幕闪烁指的是:乱码,还是数据闪烁?
hpdell 回答时间:2017-9-25 12:33:30
MrJiu 发表于 2017-9-25 09:00
你这里的屏幕闪烁指的是:乱码,还是数据闪烁?

屏幕闪烁,目前指的显示貌似有干扰条纹出现,另外,显示的汉字乱码,但是 洋文显示正常,

等播放完 flac 文件 后,再播放其他 音频音乐时,此时播放出来的音乐貌似也不行,貌似有些断断续续的声音。

如果不播放 flac文件,连续播放 wav,mp3, ape 格式的都完全没有问题。

播放其他格式的 音乐,显示都是正常的,包括 中文。
MrJiu 回答时间:2017-9-25 13:49:41
hpdell 发表于 2017-9-25 12:33
屏幕闪烁,目前指的显示貌似有干扰条纹出现,另外,显示的汉字乱码,但是 洋文显示正常,

等播放完 flac ...

你这么来说,我个人猜测,是不是屏幕的数据线受到干扰。。。
hpdell 回答时间:2017-9-25 22:33:55
本帖最后由 hpdell 于 2017-9-25 22:42 编辑
MrJiu 发表于 2017-9-25 13:49
你这么来说,我个人猜测,是不是屏幕的数据线受到干扰。。。

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

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

播放其他的 wav, mp3 都是完全没有任何问题的,而且只要不播放 flac ,显示完全正常
hpdell 回答时间:2017-9-26 22:01:12
MrJiu 发表于 2017-9-25 09:00
你这里的屏幕闪烁指的是:乱码,还是数据闪烁?

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

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

我的编译器使用的 是  iar

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

或者是需要修改哪里 ??
MrJiu 回答时间:2017-9-27 09:55:27
hpdell 发表于 2017-9-26 22:01
你好,我刚刚把 优化基本设置为最高貌似就可以了,

播放 flac 的文件屏幕不闪,但是 播放完后不能够播放 ...

我觉得乱码或者闪烁,就两个原因,要么显示数据有问题,要么数据线受到干扰。。。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

hpdell 回答时间:2017-9-28 16:00:10
MrJiu 发表于 2017-9-27 09:55
我觉得乱码或者闪烁,就两个原因,要么显示数据有问题,要么数据线受到干扰。。。 ...

如果数据线收到干扰,那么播放 wav,MP3, ape 的音乐都完全不会闪烁啊

硬件都是一样的

这个程序我是移植 keil 工程的,现在把他移植到 iar 的工程上来,有没有可能是底层的有些不兼容造成的啊 ?
冰葑世纪 回答时间:2020-7-2 16:40:32
时隔3年,我竟遇到和楼主一样的问题,我使用的是MDK工程,H7芯片,现象和楼主的一模一样。请问楼主,当年有没有继续查根问底,找到根源处?除了优化外,有没有更好的解决办法?
hpdell 回答时间:2020-7-3 09:04:13
冰葑世纪 发表于 2020-7-2 16:40
时隔3年,我竟遇到和楼主一样的问题,我使用的是MDK工程,H7芯片,现象和楼主的一模一样。请问楼主,当年有 ...

貌似没有更换的办法,

后来也没有怎么去深入的研究了,比较使用 单片机 播放 flac 只是玩玩而已

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版