MP3播放時停頓,這種結(jié)構(gòu)行嗎?

MP3播放時停頓,不連貫,怎么辦? 以下分別是讀U盤函數(shù)和MP3播放函數(shù),[size=3]用一個緩沖區(qū),環(huán)形讀寫[/size],先從U盤讀到(void disk_mp3_read(void) )緩沖區(qū),然后從緩沖區(qū)讀出(void disk_mp3_play(void))送給MP3芯片,[size=4]這種結(jié)構(gòu)行嗎?[/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]; /* 指向文件數(shù)據(jù)緩沖區(qū) */ mCmdParam.Read.mSectorCount =4; //讀出的扇區(qū)數(shù) CH375vFileSize += 511; i = CH375FileReadX( ); /* 從文件讀取數(shù)據(jù) */ CH375vFileSize -= 511; } } /////////////////////////////////////////////////////////// void disk_mp3_play(void) //播放函數(shù) { if((IO0PIN & MP3_DREQ)!=0) { Mp3SelectData(); SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解碼芯片發(fā)送數(shù)據(jù) Mp3DeselectData(); file_p++; if(file_p==0x1800) file_p=0; } }

不連貫是可能由于MP3芯片要數(shù)據(jù)時,你沒能給足 在播放函數(shù)里,你只發(fā)送了一個字節(jié),并不能滿足Mp3芯片 修改改為下面的代碼試試: void disk_mp3_play(void) //播放函數(shù) { Mp3SelectData(); while(1) { if((IO0PIN & MP3_DREQ)!=0) { SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解碼芯片發(fā)送數(shù)據(jù) file_p++; if(file_p==0x1800) { file_p=0; break; } } } Mp3DeselectData(); }


問題找到了,但還沒解決,我把MP3的數(shù)據(jù)直接做到程序里就不慢了。所以說是ch375讀出的數(shù)據(jù)太慢。

怎么解決呀?


不按照你上面寫的,直接將讀出來的數(shù)據(jù)直接推到SPI里面去也應(yīng)該是可以的。


1。我用過375,375的速度完全能滿足需要,播放300kbps的歌都沒問題 2。使用雙緩沖,一個用于播放,另一個用于在空閑時緩存數(shù)據(jù)。


環(huán)行緩沖區(qū)也沒問題,CH375讀盤速度也不慢,關(guān)鍵在于在做讀U盤數(shù)據(jù)時假如解碼器需要數(shù)據(jù)你是如何處理的.MP3格式的解碼周期是26MS,當(dāng)解碼器26MS里如果得不到一幀的數(shù)據(jù),那麼只有丟掉當(dāng)前幀,這時聲音就會頓.你每次讀4扇區(qū)按200KB來算是20MS.這時如果送數(shù)據(jù)到解碼器的平均速度如果低于1Mb就會出現(xiàn)聲音斷續(xù). 建議你在讀數(shù)據(jù)期間等待CH375中斷時也做查詢解碼器是否要數(shù)據(jù)處理.看你的程序好象是用的VS10XX的芯片,你可以這樣處理

Mp3SelectData(); while(1) { if((IO0PIN & MP3_DREQ)!=0) { for(i=0;i!=4;i++){ SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解碼芯片發(fā)送數(shù)據(jù) file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解碼芯片發(fā)送數(shù)據(jù) file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解碼芯片發(fā)送數(shù)據(jù) file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解碼芯片發(fā)送數(shù)據(jù) file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解碼芯片發(fā)送數(shù)據(jù) file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解碼芯片發(fā)送數(shù)據(jù) file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解碼芯片發(fā)送數(shù)據(jù) file_p++; SPIPutChar(FILE_DATA_BUF1_MP3[file_p]); //向解碼芯片發(fā)送數(shù)據(jù) file_p++; } if(file_p==0x1800) { file_p=0; break; } } } Mp3DeselectData(); }


if(((file_p%0x800)==0)||(file_p==0)) 有問題如果 還有你的環(huán)緩并非真正的環(huán)行緩沖區(qū),連環(huán)行緩沖區(qū)的基本要素都不具備


謝謝大家 我原來也想搞成中斷,只是一直沒有做.下午試一下. 另外環(huán)行緩沖到底是什么樣子,不是從0到最大循環(huán)嗎?


不是,是用2個指針指向一個緩沖區(qū),然后在用一個COUNT來記數(shù)


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频