IBasicAudio 인터페이스(Com오브젝트)는 사운드 관련 처리를 하는 인터페이스입니다.
get_Volume과 put_Volume 및 양쪽(스트레오) 스피커의 밸런스를 맞추는 역할을 하는데요.
문제는 get_Volume과 put_Volume 입출력 값이 -10000 ~ 0 입니다.
(http://msdn.microsoft.com/en-us/library/aa929894.aspx)
무엇이 문제냐 하면 아시다 시피 데시벨은 로그 형태로 나타나기 때문입니다.
그것도 모르고 사용자 입력값을 그냥 넣어줬더니
볼륨이 선형적으로 변하지 않고 최대값부분에서 갑자기 커지는 효과가...
그래서 그나마 선형적으로 조절하기 위해서 아래 루틴 첨가.
--------------------------------------------------------------
// volume은 0~100값을 가진다. (CSliderControl을 통해 가지고 옴)
volume = volume > 100 ? 100 : volume;
volume = volume < 0 ? 0 : volume;
volume = (volume * -1) + 100;
double result = pow( (double)1.1, (double)volume);
double max = pow(1.1, 100);
result = -10000 + ((1 - (result/max)) * (double)10000);
hr = pBasicAudio->put_Volume( result);
--------------------------------------------------------------
4line에서 volume값을 뒤집는 이유는 묻지마세요.. -0-; 귀차니즘...
식을 바꾸려고 했건만 머리가 나쁜 관계로 패스... 잘 작동하니깐...
max를 구하는 pow(1.1, 100) 같은 경우는 define으로 잡으면 편하겠네요...
아님 처음에만 구하도록 지역변수 static으로 둬서 해도 좋을것 같구요
(언젠가 비슷한 것이 쓰일 것 같아서.. 로그,제곱 <-> 선형 )
이상 끝
========================================
추가 : 위의 1.1 값을 1.065 로 바꿔서 하니깐 좀더 부드럽게 되네요.
1.1은 중간(50이상의 volume값)부터 최대 소리가 나버리네...
출처 : 내 머리