作者Mewra ()
看板C_and_CPP
標題[問題] 一個很奇怪的現像
時間Wed May 13 02:15:13 2009
用FMOD寫了一個撥放streaming audio data的程式,
以下是要去進去使用 callback function的地方.
if( isPreload == true && isBuffering == false && isPlaying == false &&
write_count - read_count >= 0 )
{
..............
exinfo.pcmreadcallback = pcmreadcallback;
..............
}
以下是 callback function, 名稱為 pcmreadcallback
const int memcpy_length = 6400;
static FMOD_RESULT F_CALLBACK pcmreadcallback( FMOD_SOUND *sound, void *data,
unsigned int datalen )
{
...............
char * wa = (char *)data;
if( isBuffering == false )
{
memcpy( wa, (char *)&sp2_sound_buffer_bank[rfp], memcpy_length );
}
read_count += 20;
rfp += memcpy_length;
if( rfp >= sp2_sound_buffer_length )
{
rfp = 0;
rfp_round++;
}
return FMOD_OK;
}
其中有用到一個 memcpy_length 這個設為 const 的變數, 宣告在函數外.
還有一個 datalen, 其值與 memcpy_length 相同, 為其它地方在調用 callback 函數
時傳進來的.
一個奇怪的現像是, 在 pcmreadcallback 裡, 若使用 memcpy_length 時, 會導致每
個 buffer 重填時增加 20個資料長度的延遲, 但若是使用 datalen取代 memcpy_length,
則完全不會產生延遲, 速度飛快. 搞不懂兩個一樣的值, 為什麼會有這種差別.
能請高手解釋一下嗎? 謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 113.10.74.201
1F:推 ledia:要不要 assert(datalen==memcpy_length); 一下試試 ? 05/13 02:24
2F:→ Mewra:嗯嗯 明天來試一下 05/13 02:49
3F:→ Mewra:assert(datalen==memcpy_length);之後, 從頭到尾程式都沒有 05/13 12:40
4F:→ Mewra:終止. 但是將unsigned int datalen加個 const 後, 開始有延 05/13 12:41
5F:→ Mewra:遲的現像, 但還是比使用 memcpy_length 要快 05/13 12:41