请教下,播放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
有干扰?是闪烁?屏幕是什么接口方式?
rgb接口的,但是播放ape,wav等音频屏幕显示非常好,就唯独这个 flac 音频就不行,估计应该是什么地址搞错了,但是具体的也不清楚到底是哪里出了问题,播放 flac 音频时,声音貌似还可以 hpdell 发表于 2017-9-24 22:36
rgb接口的,但是播放ape,wav等音频屏幕显示非常好,就唯独这个 flac 音频就不行,估计应该是什么地址搞错 ...
你这里的屏幕闪烁指的是:乱码,还是数据闪烁? MrJiu 发表于 2017-9-25 09:00
你这里的屏幕闪烁指的是:乱码,还是数据闪烁?
屏幕闪烁,目前指的显示貌似有干扰条纹出现,另外,显示的汉字乱码,但是 洋文显示正常,
等播放完 flac 文件 后,再播放其他 音频音乐时,此时播放出来的音乐貌似也不行,貌似有些断断续续的声音。
如果不播放 flac文件,连续播放 wav,mp3, ape 格式的都完全没有问题。
播放其他格式的 音乐,显示都是正常的,包括 中文。 hpdell 发表于 2017-9-25 12:33
屏幕闪烁,目前指的显示貌似有干扰条纹出现,另外,显示的汉字乱码,但是 洋文显示正常,
等播放完 flac ...
你这么来说,我个人猜测,是不是屏幕的数据线受到干扰。。。 本帖最后由 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 ,显示完全正常 MrJiu 发表于 2017-9-25 09:00
你这里的屏幕闪烁指的是:乱码,还是数据闪烁?
你好,我刚刚把 优化基本设置为最高貌似就可以了,
播放 flac 的文件屏幕不闪,但是 播放完后不能够播放其他 类型的 音乐文件了,
我的编译器使用的 是iar
这个问题是不是说明 这个 flac 的库文件有些指针写的不支持 iar 编译器啊 ?
或者是需要修改哪里 ?? hpdell 发表于 2017-9-26 22:01
你好,我刚刚把 优化基本设置为最高貌似就可以了,
播放 flac 的文件屏幕不闪,但是 播放完后不能够播放 ...
我觉得乱码或者闪烁,就两个原因,要么显示数据有问题,要么数据线受到干扰。。。 MrJiu 发表于 2017-9-27 09:55
我觉得乱码或者闪烁,就两个原因,要么显示数据有问题,要么数据线受到干扰。。。 ...
如果数据线收到干扰,那么播放 wav,MP3, ape 的音乐都完全不会闪烁啊
硬件都是一样的
这个程序我是移植 keil 工程的,现在把他移植到 iar 的工程上来,有没有可能是底层的有些不兼容造成的啊 ?
页:
[1]
2