2012-10-27 3 views
0

클라이언트에 대해 몇 가지 오디오 프로그래밍을하고 있는데 이해가 안되는 문제가 있습니다.목표 C 변수 값이 보존되지 않습니다.

CoreAudio에서 반복적으로 호출되는 렌더링 콜백이 있습니다. 이 콜백 안에는 다음이 있습니다.

// Get the audio sample data 
AudioSampleType *outA = (AudioSampleType *)ioData->mBuffers[0].mData; 

Float32 data; 

// Loop over the samples 
for (UInt32 frame = 0; frame < inNumberFrames; frame++) { 

    // Convert from SInt16 to Float32 just to prove it's possible 
    data = (Float32) outA[frame]/(Float32) 32768; 

    // Convert back to SInt16 to show that everything works as expected 
    outA[frame] = (SInt16) round(next * 32768); 

} 

예기치 않은 반올림 오류가 없음을 나타내는 예상대로 작동합니다.

다음으로하고 싶은 것은 작은 지연을 추가하는 것입니다. 나는 클래스에 전역 변수를 추가

Float32 last = 0; 

그럼 내가 하나의 프레임 지연 얻기 위해이 변수를 사용하는 @implementation 선 아래 :

// Get the audio sample data 
AudioSampleType *outA = (AudioSampleType *)ioData->mBuffers[0].mData; 

Float32 data; 
Float32 next; 

// Loop over the samples 
for (UInt32 frame = 0; frame < inNumberFrames; frame++) { 

    // Convert from SInt16 to Float32 just to prove it's possible 
    data = (Float32) outA[frame]/(Float32) 32768; 

    next = last; 
    last = data; 


    // Convert back to SInt16 to show that everything works as expected 
    outA[frame] = (SInt16) round(next * 32768); 

} 

이 시간은 라운드 거기를 이상한 오디오 왜곡.

내가 잘못하고있는 것을 볼 수 없어! 모든 조언을 크게 주시면 감사하겠습니다.

+0

저는 이것이 오디오 문제이고 C 문제는 아니라고 생각합니다. 모든 변수의 값을 기록하고 도움이되는지 확인하십시오. 결론에 도달하기 전에 항상 기록하십시오. – Linuxios

+1

이것은 스레딩 문제 일 수 있습니다. 코드가 항상 같은 스레드에서 실행되는지 확인하십시오. 즉, NSLog (@ "thread : % @", [NSThread currentThread]). 그렇지 않은 경우 잠금/뮤텍스를 사용하여 전역을 보호해야합니다. – EricS

답변

2

의도 한대로 오디오에 의도하지 않은 phaser 효과가 도입 된 것으로 보입니다.

이것은 오디오의 한 채널 만 지연시키기 때문입니다. 그 결과, 왼쪽 채널이 오른쪽 채널 한 프레임 뒤로 지연됩니다. 이것은 "이상한 오디오 디스토션"에 대한 귀하의 설명에 맞는 약간의 홀수 주파수 소거/증폭을 초래할 것입니다.

두 채널 모두에 효과를 적용 해보십시오 :

AudioSampleType *outA = (AudioSampleType *)ioData->mBuffers[0].mData; 
AudioSampleType *outB = (AudioSampleType *)ioData->mBuffers[1].mData; 
// apply the same effect to outB as you did to outA 

이것은 당신이 (즉, ioData->mNumberBuffers == 2) 스테레오 오디오 스타일의 문제로

작업하는 것으로 가정합니다, 그것은 (IMO)에 대한 나쁜 생각 렌더링 콜백에서 last 변수와 같은 전역 변수를 사용하십시오. inRefCon을 사용하여 적절한 컨텍스트 (단일 변수 또는 필요한 경우 구조체)로 전달하십시오. 이 문제는 현재 가지고있는 문제와 관련이 없습니다.

+0

+1 오디오 녀석을 집에 데려 간다. 우수 답변! –

+0

답변 해 주셔서 감사합니다. 나는 실제로 채널을 사용하는 이유 인 모노 스트림 형식 (iPad 용)을 사용하고있었습니다. 문제는 오디오가 SInt16보다는 SInt32 인 것으로 밝혀졌습니다. 그 결과 실수로 SInt16을 SInt32로 캐스팅했습니다. 이것은 약간의 데이터 비트가 매달려있는 것처럼 보입니다. 도덕적 인 것 - 어떤 종류의 변수를 사용하고 있는지 매우주의하십시오! 전역 변수를 테스트 목적으로 엄격하게 사용했습니다. 실제로 나는 inRefCon에 많은 변수와 버퍼가 포함되도록 코러스 효과를 작성했습니다. –

관련 문제