2014-04-27 4 views
1

이 문제를 해결하는 사람은 Sherlock Holmes 트로피를 가져야합니다. 여기 간다.마지막 AudioQueueBuffer의 수치가 과장되어

오디오 (LPCM, SInt16, 4 버퍼)를 녹음하기 위해 AudioQueues를 사용합니다. 콜백에서 샘플을 float으로 변환하고 vDSP_meamgv를 사용하여 평균 진폭을 측정했습니다. 다음은 몇 가지 예입니다.

Mean, No of samples 
44.400364, 44100 
36.077393, 44100 
27.672422, 41984 
2889.821289, 44100 
57.481972, 44100 
58.967506, 42872 
54.691631, 44100 
2894.467285, 44100 
62.697800, 42872 
63.732948, 44100 
66.575623, 44100 
2979.566406, 42872 

네 번째 (마지막) 버퍼는 야생입니다. 저는 분리 된 샘플을 보았습니다. 0과 많은 거대한 숫자가 많이 있었고, 다른 버퍼처럼 일반적인 숫자가 없었습니다. 더 재미있는 일이 있습니다. 대신 3 개의 버퍼를 사용하면 세 번째 버퍼 (항상 마지막 버퍼)는보기입니다. 그리고 이것은 내가 선택한 많은 수의 버퍼에도 적용됩니다.

야생 버퍼를 대기열에 추가하지 않으려면 콜백에 if를 넣고 일단 사라지면 큰 숫자가없고 다른 버퍼는 계속 정상적으로 채워집니다. 나는 큐를 놓은 후에이 큐를 다시 큐에 넣는 버튼을 넣었다. 일단 다시 큐에 넣으면 다시 거대한 샘플로 채워진다. (즉 버퍼!)

이제 체리 - Apple의 SpeakHere와 같은 다른 프로젝트에서도 마찬가지입니다. 앱이 제대로 작동하더라도 기록 된 내용을 녹음하고 재생할 때도 마찬가지입니다.

나는 그것을 얻지 못한다. 나는 이것을 알아 내기 위해 머리를 부 풀렸다. 누군가가 실마리를했을 경우 도움이된다면 ...

다음은 콜백입니다 :

void Recorder::MyInputBufferHandler(void *        inUserData, 
            AudioQueueRef       inAQ, 
            AudioQueueBufferRef     inBuffer, 
            const AudioTimeStamp *     inStartTime, 
            UInt32         inNumPackets, 
            const AudioStreamPacketDescription* inPacketDesc) { 
    Recorder* eu = (Recorder*)inUserData; 

    vDSP_vflt16((SInt16*)inBuffer->mAudioData, 1, eu->conveier, 1, inBuffer->mAudioDataByteSize); 
    float mean; 
    vDSP_meamgv(eu->conveier, 1, &mean, inBuffer->mAudioDataByteSize); 
    printf("values: %f, %d\n",mean,inBuffer->mAudioDataByteSize); 
// if (mean<2300) 
     AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL); 
} 

는 'conveier가'나는 미리 할당 한 float 배열입니다.

답변

1

나 또한 트로피를 얻습니다. 오류는 배열에 요소 수가 필요하기 때문에 vDSP 함수에 mAudioDataByteSize 매개 변수가 없어야한다는 것입니다. 내 경우에는 각 요소 (SInt16)에 2 바이트가 있으므로 mAudioDataByteSize/2를 넘겨 줘야합니다. 마지막 버퍼를 읽을 때 다른 길이만큼 가장자리에서 떨어져 무작위 데이터가 몇 개 계산됩니다. 빌라! 아주 기본적인 실수지만, 모든 잘못된 장소를 들여다 보면 그렇게 보이지 않습니다.

동일한 갈퀴를 밟은 사람은 ...

PS. 목욕하는 동안 나에게왔다. :)