MP3播放时停顿,这种结构行吗?

MP3播放时停顿,不连贯,怎么办? 以下分别是读U盘函数和MP3播放函数,[size=3]用一个缓冲区,环形读写[/size],先从U盘读到(void disk_mp3_read(void) )缓冲区,然后从缓冲区读出(void disk_mp3_play(void))送给MP3芯片,[size=4]这种结构行吗?[/size]

#define FILE_DATA_BUF_LEN_MP3 0x1800 uint8 FILE_DATA_BUF1_MP3[FILE_DATA_BUF_LEN_MP3];//缓冲 uint32 file_p; //缓冲播放指针

/////////////////////////////////////////////////////////// void disk_mp3_read(void) { if(((file_p%0x800)==0)||(file_p==0)) { mCmdParam.ReadX.mDataBuffer = &FILE_DATA_BUF1_MP3[file_p]; /* 指向文件数据缓冲区 */ mCmdParam.Read.mSectorCount =4; //读出的扇区数 CH375vFileSize += 511; i = CH375FileReadX( ); /* 从文件读取数据 */ CH375vFileSize -= 511; } } /////////////////////////////////////////////////////////// void disk_mp3_play(void) //播放函数 { if((IO0PIN & MP3_DREQ)!=0) { Mp3SelectData(); SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解码芯片发送数据 Mp3DeselectData(); file_p++; if(file_p==0x1800) file_p=0; } }

不连贯是可能由于MP3芯片要数据时,你没能给足 在播放函数里,你只发送了一个字节,并不能满足Mp3芯片 修改改为下面的代码试试: void disk_mp3_play(void) //播放函数 { Mp3SelectData(); while(1) { if((IO0PIN & MP3_DREQ)!=0) { SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解码芯片发送数据 file_p++; if(file_p==0x1800) { file_p=0; break; } } } Mp3DeselectData(); }


问题找到了,但还没解决,我把MP3的数据直接做到程序里就不慢了。所以说是ch375读出的数据太慢。

怎么解决呀?


不按照你上面写的,直接将读出来的数据直接推到SPI里面去也应该是可以的。


1。我用过375,375的速度完全能满足需要,播放300kbps的歌都没问题 2。使用双缓冲,一个用于播放,另一个用于在空闲时缓存数据。


环行缓冲区也没问题,CH375读盘速度也不慢,关键在于在做读U盘数据时假如解码器需要数据你是如何处理的.MP3格式的解码周期是26MS,当解码器26MS里如果得不到一帧的数据,那麽只有丢掉当前帧,这时声音就会顿.你每次读4扇区按200KB来算是20MS.这时如果送数据到解码器的平均速度如果低于1Mb就会出现声音断续. 建议你在读数据期间等待CH375中断时也做查询解码器是否要数据处理.看你的程序好象是用的VS10XX的芯片,你可以这样处理

Mp3SelectData(); while(1) { if((IO0PIN & MP3_DREQ)!=0) { for(i=0;i!=4;i++){ SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解码芯片发送数据 file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解码芯片发送数据 file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解码芯片发送数据 file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解码芯片发送数据 file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解码芯片发送数据 file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解码芯片发送数据 file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解码芯片发送数据 file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解码芯片发送数据 file_p++; } if(file_p==0x1800) { file_p=0; break; } } } Mp3DeselectData(); }


if(((file_p%0x800)==0)||(file_p==0)) 有问题如果 还有你的环缓并非真正的环行缓冲区,连环行缓冲区的基本要素都不具备


谢谢大家 我原来也想搞成中断,只是一直没有做.下午试一下. 另外环行缓冲到底是什么样子,不是从0到最大循环吗?


不是,是用2个指针指向一个缓冲区,然后在用一个COUNT来记数


只有登录才能回复,可以选择微信账号登录