2012-11-06 9 views
3

Rtaudio 라이브러리를 사용하고 있습니다. 예를 들어 왼쪽 채널에서 오른쪽 채널로 사운드를 이동하는 등 패닝을 제어 할 수있는 오디오 프로그램을 구현하고 싶습니다.RtAudio로 오디오 패닝을 조정하는 방법

필자의 경우 듀플렉스 모드를 사용합니다 (예 : duplex mode). 즉, 마이크 입력을 스피커 출력에 연결합니다.

출력 버퍼에 필터를 적용해야합니까? 어떤 종류의 필터?
아무도 도와 줄 수 있습니까?

답변

0

왼쪽의 신호를 줄이려면 왼쪽의 모든 샘플에 1보다 작거나 같은 수를 곱하면됩니다. 마찬가지로 우익을 위해 그 번호 r을 부를 것이다. 일반적으로 말하자면, 1보다 큰 수를 곱하기를 원하지 않거나 신호가 왜곡 될 수 있습니다.

l 및 r은 모두 "팬 위치"의 기능입니다. 팬 위치에서 전화 번호로 어떻게 연결되는지에 대한 논의가 필요합니다. 이 뭔가를 간단 경우, 당신은 단지 극단에서이 값을 사용하여 선형 값을 램프 다운 수 :

Hard Left: 
l=1; r=0 
Center: 
l=1; r=1 
Hard Right: 
l=0; r=1; 

을이 애호가 어떤 경우에는 "팬 법"에 대한 구글해야한다. 여기에 좋은 시작처럼 보이는 예는 다음과 같습니다

http://www.kvraudio.com/forum/viewtopic.php?p=4264576

UPDATE : 내가 RT 오디오 (나는 보통 유사하다 PortAudio를 사용) 사용한 적이 있지만, 내가 이동하는 코드가 같을 것이라고 생각 이것은 위에서 정의 된 l 및 r을 사용합니다 (int32_t - 32 비트 정수로 서명 된 것으로 가정).

int inout(void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, 
      double streamTime, RtAudioStreamStatus status, void *data) 
{ 
    if (status) std::cout << "Stream over/underflow detected." << std::endl; 

    int32_t *ob = (int32_t *)outputBuffer; 
    int32_t *in = (int32_t *)inputBuffer; 

    unsigned long *bytes = (unsigned long *) data; 
    int i =0; 
    while(i < bytes/4) { 
    ob[i] = (int32_t) (ib[i] * l + .5); 
    ++i; 
    ob[i] = (int32_t) (ib[i] * r + .5); 
    ++i; 
    } 
    return 0; 
} 
+0

답장을 보내 주셔서 감사합니다. – user1801724

+0

사실, 그건 내가 필요한 것이 아닙니다. 듀플렉스 모드 예제에서 시작하면, inout 함수에 하나의 audio * outputBuffer가 있습니다. 해당 버퍼를 수정하여 패닝을 얻으려면 어떻게해야합니까? 간단한 2D 오디오 패닝을 의미합니다. – user1801724

+0

샘플 코드를 추가했는데, 맞는지 확실하지는 않지만 아이디어를 줄 것입니다. RtAudio가 지원하는 부동 소수점 데이터를 사용하는 것이 더 쉬울 수도 있습니다. 또한 참고로, 대부분의 사람들은 2D 패닝이라고 말합니다. 따라서 혼동은 없지만 실제로는 1D입니다. –