2015-01-16 9 views
0

는 :왜 사운드가 손상 되었습니까? 이 코드에 대한

while (1) { 
    generate_noise(frames, period_size); 
    snd_pcm_writei(dev, frames, period_size); 
} 

잘 작동 ..

그러나 이것에 대한

:

generate_noise(frames, period_size); 
while (1) { 
    snd_pcm_writei(dev, frames, period_size); 
} 

소리가 끊어집니다. 각 반복에는 들리는 균열이 있습니다! 이로 인해 항상 버퍼가 업데이트됩니다. 왜?

UPD :

typedef struct { 
    int16_t left; 
    int16_t right; 
} pcm_frame; 

... 

void 
generate_noise(pcm_frame *frames, const size_t size) 
{ 
    size_t pos = 0; 

    while (pos < size) { 
     frames[pos].left = rand() % 200; 
     frames[pos].right = rand() % 200; 
     pos += 1; 
    } 
} 
+0

은 generate_noise가 매번 다른 샘플을 생성합니까? , 그렇지 않다면 snd_pcm_writei는 쓰기가 완료되도록 충분한 지연을 가지고 있습니다 (프로세서가 PCM 블록보다 빠르게 실행 중일 수 있습니다)? –

+0

@bare_metal 자세한 정보는 업데이트 소식입니다. – Deep

+0

첫 번째 경우에는 매번 새 샘플을 생성하고 두 번째 경우에는 동일한 샘플을 반복해서 사용합니다. –

답변

2

이 비 주기적 화이트 노이즈를 생성합니다.

while (1) { 
    generate_noise(frames, period_size); 
    snd_pcm_writei(dev, frames, period_size); 
} 

이것은주기적인 파형을 생성합니다 ... 잡음이 아닙니다! 인간의 귀는 놀라운 기계이며 실제로 동일한 소음을 반복해서 사용하고 있다고 말할 수 있습니다. 48 kHz에서

generate_noise(frames, period_size); 
while (1) { 
    snd_pcm_writei(dev, frames, period_size); 
} 

, 1024 개 샘플의 시간과 함께, 그것을 주 가지 recognizeable 배음 많은 것 중 C. 아래 제 G 부근 46.9 ㎐,에서 메모를 생성하며, 윌 백색 잡음처럼 들리지 않습니다.

화이트 노이즈가 발생하면 너무 빨리 반복 할 수 없습니다. 루프를 만들기 때문에 주기적으로 반복되는 것이므로 이는 알아볼 수있는 메모입니다. 루프를 반복하려면 루프를 길게 만들어야합니다.

+0

예, 바로 당신입니다! – Deep