hpdell 发表于 2017-9-19 20:04:07

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

本帖最后由 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;
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 = {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,bytesleft-consumed);
      bytesleft-=consumed;

      f_read(audiodev.file, &filebuf,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 ,显示完全正常


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 的文件屏幕不闪,但是 播放完后不能够播放 ...

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

hpdell 发表于 2017-9-28 16:00:10

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

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

硬件都是一样的

这个程序我是移植 keil 工程的,现在把他移植到 iar 的工程上来,有没有可能是底层的有些不兼容造成的啊 ?
页: [1] 2
查看完整版本: 请教下,播放flac音乐时,屏幕有干扰,是怎么回事啊 ?