-
[openAL] #5. Guide 읽기 - 3 [소스 스트리밍 및 도플러 효과]개발일지 2021. 10. 8. 13:28728x90
https://www.openal.org/documentation/OpenAL_Programmers_Guide.pdf
소스에 버퍼 올리기 (Queuing)
끊김 없이 연속으로 음원을 streaming 하기 위해서는 버퍼를 queuing 하는 것이 필요하다.
버퍼를 queuing 하기 위해서는 가장 먼저 버퍼와 소스가 정상적으로 생성되어 있어야한다.
그리고 버퍼를 소스에 붙이기 위해 alSourcei를 사용하지 말아야 한다.
대신, alSourceQueueBuffers와 alSourceUnqueueBuffers가 사용된다.
alSourceQueueBuffers를 이용해 Buffer를 소스에 올리고, alSourcePlay로 재생한다.
소스가 재생되는 동안에도 alSourceUnqueueBuffers를 이용해 언제든지 버퍼를 해제하여 새로운 데이터로 채워지거나 제거될 수 있다.
그 뒤 수정된 버퍼는 alSourceQueuebuffers로 다시 올릴 수 있다.
queue에 새로운 버퍼가 존재하는 한은 소스는 계속 재생된다.
1.1 버전 이상의 OpenAL은 아래와 같은 사항들을 주의해야 한다.
1) 스트리밍을 위한 소스는 첫 버퍼를 alSourcei로 붙이면 안되고, 항상 alSourceQueueBuffers를 이용해 올려야 한다. 모든 버퍼를 alSourcei로 제거한 후에는 alSourcei와 alSourceQueuBuffers 둘 중 무엇으로 올리느냐에 따라 스트리밍 여부가 결정된다.
2) alSourceQueueBuffers로 소스에 올려진 버퍼들은 모두 같은 포맷이어야 한다.
도플러 효과
도플러 효과는 음원과 리스너의 매질에 대한 상대적인 속도, 그리고 매질내에서의 음파의 속도에 따라 달라진다.
OpenAL에서는 현실과 같이 물리적인 정확하게 계산된 도플러 효과를 기대하기는 힘들다.
여기서 주파수 변화는 오직 리스너와 소스의 속도로 결정된다.
OpenAL에서 구현된 도플러효과의 공식은 아래와 같다. 매질(공기, 물)이 리스너와 소스에 대해 움직이는 현상은 제외한다.
SS: AL_SPEED_OF_SOUND = 음속 (기본값은 343.3m/s)
DF: AL_DOPPLER_FACTOR = 도플러 인자 (기본값은 1.0)
vls : Listener velocity scalar (소스-리스너 벡터에 투영된 리스너 속력, 스칼라)
vss : Source velocity scalar (소스-리스너 벡터에 투영된 소스 속력, 스칼라)
f : Frequency of sample (샘플의 주파수)
f' : effective Doppler shifted frequency (도플러 효과에 의해 변한 주파수)
vls와 vss 의 관계 도식도

어느 방향으로 움직이든 둘을 이어붙인 선상에 투영시킨 속력을 계산.
3차원에서의 계산은 아래와 같다.

음속과 도플러 인자를 다루는 API가 각각있다.
AL_DOPPLER_FACTOR 는 도플러 효과값을 손쉽게 스케일링 할 수 있다.
void alDopplerFactor(ALfloat dopplerFactor)음수는 AL_INVALID_VALUE 에러를 유발시키고, 무시된다. 기본값은 1.
현재 세팅은 alGetFloat(AL_DOPPLER_FACTOR)를 호출해 볼 수 있다.
AL_SPEED_OF_SOUND는 도플러 효과에 사용되는 음속을 수정할 수 있다.
이때 소스와 리스너의 속도는 같은 단위로 표현돼야 한다.
void alSpeedOfSound(ALfloat speed)음수와 0은 AL_INVALID_VALUE 에러를 유발시키고 무시된다. 기본값은 343.3(m/s)
현재 값은 alGetFloat(AL_SPEED_OF_SOUND)로 알 수 있다.
거리와 속도의 단위는 완전히 독립적이므로 둘을 다른 단위로 사용하는 것이 바람직하다.
만약 도플러 효과를 무시하고 싶다면, 모든 속도를 0으로 두는것이 좋다.
'개발일지' 카테고리의 다른 글
[openAL] #7. 소리 재생 예제 만들기 (0) 2021.10.08 [openAL] #6. Guide 읽기 - 4 [에러 핸들링] (0) 2021.10.08 [openAL] #4. Guide 읽기 - 2 (0) 2021.10.07 [openAL] #3. Guide 읽기 - 1 (0) 2021.10.07 [openAL] #2. 음악 재생하기 (0) 2021.10.06