2013-06-20 45 views
0

我需要儘快讀入波形文件。我目前正在做的是以下幾點:libsndfile sf_readf_short最大幀數

SFINFO sfinfo; 
SNDFILE *wavFilefd = sf_open ("mySong.wav", SFM_READ, &sfinfo); 
int readBlockSize = 1024*1024; // 1MB 
if(sfinfo.frames * 2 < readBlockSize) 
{ 
    // actually I don't know where this factor two comes from, but it work's for me 
    readBlockSize = sfinfo.frames * 2; 
}      
short tmpSignal[readBlockSize]; 
int readcount = -1; 
std::vector<short> wavVector; 
while ((readcount = sf_readf_short (wavFilefd, tmpSignal, readBlockSize)) > 0) 
{ 
    ++nRead; 
    wavVector.reserve((nRead-1) * readBlockSize + nRead); 
    wavVector.insert(wavVector.end(), tmpSignal, tmpSignal+readcount); 
}      
sf_close(wavFilefd); 

此代碼目前效果很好。

問題:當我增加讓我們說10倍,然後嘗試讀取的字節數115212164波形文件做sf_readf_short當我得到一個分段錯誤的readBlockSize的價值。

help「的sf_readf_XXXX函數返回的幀數閱讀。除非讀期間達到了文件的末尾,返回值應等於請求幀的數量。任何試圖讀取超出結尾的文件不會導致錯誤,但會導致sf_readf_XXXX函數返回小於請求的幀數,如果已經在文件末尾返回0。

所以我預計這也適用於10MB。

感謝您的任何提示。

+0

何你得到編譯行'短tmpSignal [readBlockSize]被複制(至少在我的機器)?不可能在C++中分配一個非編譯時常量值大小的數組。 – Gonmator

+0

你從哪裏得到分段錯誤?我假設在'sf_readf_short'中,我說得對嗎? – Gonmator

+0

@Gonmator:確切地說。我更新了我的帖子。 – ezdazuzena

回答

0

問題是堆棧的大小,因此通過

//.. 
short tmpSignal[readBlockSize]; 
//.. 

訪問變量`tmpSignal」,分配時,我得到了分段錯誤。 `;

這種行爲可以通過

short tmp[10485760]; 
for(unsigned int i = 0; i < 10485760; ++i) 
{ 
    tmp[i] = 0; 
} 
0

從libsndfile文檔:

sf_count_t sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ; 

的文件讀取功能的幀填充陣列指向PTR與 數據幀的請求的數目。該陣列必須足夠大以保持幀的乘積和通道數量。

必須小心,以確保有足夠的空間陣列 ptr指向到,採取(幀*通道)項 數(短褲,整型,浮點型或加倍)。

readBlockSize指定的幀數,但你必須爲幀數分配內存*通道數。

我不知道你怎麼真的分配tmpSignal緩衝區,但你應該這樣做readBlockSize *通道數量(假設2)。 (或者將每2個指定的幀數除以readBlockSize調用函數)。

+0

我使用的wave文件只有一個頻道 – ezdazuzena

+0

@ezdazuzena:在這種情況下,這不是一個解決方案,對不起! – Gonmator