2013-06-20 1 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); 

이 코드는 지금까지 잘 작동합니다.

문제 : 나는 이제 sf_readf_short을 할 때 나는 세그먼트 오류를 ​​얻을 115,212,164 바이트의 웨이브 파일을 읽으려고 시도 후 10 배를 말하고하자에 의한 readBlockSize의 값을 증가합니다. 내가 을받은 help에서

는 "sf_readf_XXXX 기능은 프레임의 수를 읽어 보시기 바랍니다. 파일의 끝이 읽기 동안 도달하지 않는 한, 반환 값은 요청 프레임 수를 동일해야합니다. 끝을지나 읽을 시도 반환 파일의 오류가 발생하지 않지만 sf_readf_XXXX 함수가 요청한 프레임 수보다 적게 반환하거나 파일 끝에 이미있는 경우 0을 반환합니다. "

그래서 10MB에서도 작동 할 것으로 예상됩니다.

어떤 힌트를 주셔서 감사합니다. libsndfile 문서에서

+0

호에 의해 (적어도 내 컴퓨터에서) 재현 할 수 있습니까? 컴파일 타임이 아닌 const 값을 가진 배열을 C++로 할당 할 수 없습니다. – Gonmator

+0

세그멘테이션 결함은 어디서 얻습니까? 'sf_readf_short'에서 가정합니다. – Gonmator

+0

@Gonmator : 정확히. 내 게시물을 업데이트했습니다. – ezdazuzena

답변

0

문제는 스택 크기, 그래서

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

에 의해 할당 된 변수`tmpSignal '를 액세스 할 때 나는 세그먼트 오류를 ​​얻을. `;

이 동작

는 라인`짧은 tmpSignal [readBlockSize] 컴파일을받을 수 있나요

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

는 :

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

파일은 프레임 함수 배열 와 PTR에 의해 데이터 프레임의 수만큼 작성 지시 읽었다. 배열은 프레임 수와 채널 수를 유지할만큼 충분히 커야합니다 ( ).

관리는 (* 프레임 채널)을 취할 충분한 공간이 는 ptr이 가리키는 배열이 있다는 항목 수 있도록주의해야합니다 (반바지,의 int를, 수레 또는 복식).

readBlockSize하는 프레임 수를 지정,하지만 당신은 프레임 수에 대한 메모리를 할당 할 필요가 * 채널 수.

어떻게 실제로 tmpSignal 버퍼를 할당할지는 모르지만, readBlockSize * 채널 수 (아마도 2)로해야합니다. (또는 2 프레임 단위로 지정된 프레임 수를 readBlockSize 호출 함수로 나눕니다).

+0

내가 사용하는 웨이브 파일에는 채널이 하나만 있습니다. – ezdazuzena

+0

@ezdazuzena :이 경우 해결 방법이 아닙니다. 죄송합니다. – Gonmator