[問題] 一個很奇怪的現像

看板C_and_CPP (C/C++)作者時間16年前 (2009/05/13 02:15), 編輯推噓1(104)
留言5則, 2人參與, 最新討論串1/1
用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

05/13 02:24, , 1F
要不要 assert(datalen==memcpy_length); 一下試試 ?
05/13 02:24, 1F

05/13 02:49, , 2F
嗯嗯 明天來試一下
05/13 02:49, 2F

05/13 12:40, , 3F
assert(datalen==memcpy_length);之後, 從頭到尾程式都沒有
05/13 12:40, 3F

05/13 12:41, , 4F
終止. 但是將unsigned int datalen加個 const 後, 開始有延
05/13 12:41, 4F

05/13 12:41, , 5F
遲的現像, 但還是比使用 memcpy_length 要快
05/13 12:41, 5F
文章代碼(AID): #1A2Roo6p (C_and_CPP)
文章代碼(AID): #1A2Roo6p (C_and_CPP)