2010-12-07 2 views
5

iOS 용 주파수 감지 응용 프로그램에서 작업 중이며 마이크에서 오디오 샘플로 사용자 정의 AudioBufferList를 채우는 데 문제가 있습니다.원격 I/O, AudioUnitRender -50 리턴 코드로 녹음

InputCallback 메서드에서 AudioUnitRender를 호출하면 반환 코드가 -50이됩니다. 내 매개 변수 중 하나가 잘못되었음을 의미합니다 믿습니다. 나는 그것이 AudioBufferList라고 추측하고 있지만, 무엇이 잘못되었는지 알아낼 수 없었다. 내 ASBD에서 지정한 데이터 형식과 일치하도록 설정 한 것 같습니다. 다음은

리모트 I/O 설정과 기능은 내가 잘못 될 수 믿고 호출

ASBD :

size_t bytesPerSample = sizeof(AudioUnitSampleType); 
AudioStreamBasicDescription localStreamFormat = {0}; 
localStreamFormat.mFormatID = kAudioFormatLinearPCM; 
localStreamFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical; 
localStreamFormat.mBytesPerPacket = bytesPerSample; 
localStreamFormat.mBytesPerFrame = bytesPerSample; 
localStreamFormat.mFramesPerPacket = 1; 
localStreamFormat.mBitsPerChannel = 8 * bytesPerSample; 
localStreamFormat.mChannelsPerFrame = 2; 
localStreamFormat.mSampleRate = sampleRate; 

InputCallback 선언 :

err = AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_SetInputCallback, 
          kAudioUnitScope_Input, 
          kOutputBus, &callbackStruct, sizeof(callbackStruct)); 

AudioBufferList 선언 :

// Allocate AudioBuffers 
bufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer)); 
bufferList->mNumberBuffers = 1; 
bufferList->mBuffers[0].mNumberChannels = 2; 

bufferList->mBuffers[0].mDataByteSize = 1024; 
bufferList->mBuffers[0].mData = calloc(256, sizeof(uint32_t)); 
,691,363,210

InputCallback 기능 :

AudioUnit rioUnit = THIS->ioUnit; 
OSStatus renderErr; 
UInt32 bus1 = 1; 
renderErr = AudioUnitRender(rioUnit, ioActionFlags, inTimeStamp, bus1, inNumberFrames, THIS->bufferList); 

몇 가지주의 할 :

  • /O 데이터가 8.24 비트 고정 점 I는 샘플 레이트 = 리모트 I의 표준 형식 이후 22,050 Hz의
  • 인 샘플은 각각 32 비트 (또는 4 바이트)라고 가정합니다. unsigned int가 4 바이트이기 때문에 저는 이것을 사용하여 오디오 버퍼를 할당합니다.
  • 오디오 데이터 흐름을 입력 대신 PassThru로 구현하면 오디오를 올바르게 렌더링 할 수있는 동일한 코드를 얻을 수 있습니다.
  • 원격 I/O에서 이미 Michael Tyson's blog post을 보았습니다. 내가하고있는 것과는 다른 어떤 것도 보지 못했다.

다시 한 번 감사드립니다.

라고 Demetri

+0

필자가 언급 한 주파수 탐지 어플리케이션을 마쳤습니다. 관심있는 사람들을 위해 소스 코드와 함께 글을 올렸습니다. 편집 : 링크 ... http : //sleepyleaf.com/2011/01/25/pitch-detection-in-ios-4-x/ – irtemed88

+0

언급 된 코드가 발견되지 않았습니다. 링크 sleepyleaf.com/2011/ 01/25/pitch-in-ios-4-x - irtemed88 –

+0

죄송합니다. 도메인을 업데이트했습니다. 새 링크 : http://demetrimiller.com/2011/01/25/pitch-detection-in-ios-4-x/ – irtemed88

답변

4

프레임 당 채널이 2 개인 경우 프레임 크기로 bytesPerSample을 사용할 수 없습니다. 용어 혼란 비트이므로 :

  • 샘플는 파형의 소정 위치에 하나의 값이다
  • 특정 오디오 스트림과 관련된 데이터를 참조하는 채널, 즉, 좌측/스테레오 용 오른쪽 채널, 모노 용 단일 채널 등
  • 프레임는 파형
  • 주어진 위치에 대한 모든 채널에 대한 샘플을 포함하는 패킷에 포함 된 하나

그래서 기본적으로, 당신은 mBytesPerFrame에 대한 bytesPerSample * mChannelsPerFrame를 사용할 필요가 더 많은 프레임, 및 mBytesPerPacketmBytesPerFrame * mFramesPerPacket을 사용하십시오.

또한 샘플 크기에 32 비트를 사용하고있는 것으로 나타났습니다. 정말 이것을 원한다면 잘 모르겠습니다 - 일반적으로 16 비트 샘플을 사용하여 오디오를 녹음하고 싶습니다. 대부분의 청취자는 16 비트와 32 비트 오디오의 사운드 차이를 거의 듣지 못합니다 (평균 CD는 44.1kHz, 16 비트 PCM에서 마스터 됨), I/O 및 스토리지 비용의 50 %를 절약 할 수 있습니다.

+0

감사합니다! 문서에 표준 오디오 샘플 형식이 8.24 비트 고정 소수점이라고 나와 있기 때문에 좀 혼란 스러웠습니다. 내가 사용하던 형식이고 그것이 32 비트라고 가정했습니다. 16 비트 샘플을 사용하는 경우 샘플 유형이 16 비트 부호있는 int임을 의미합니까? – irtemed88

+0

예, 16 비트는 데이터가 기술적으로 서명 된 반바지 또는 'SInt16'으로 저장된다는 것을 의미합니다. 그리고 예, 8-24 비트가 가장 일반적인 범위를 나타내지 만 거의 모든 일상적인 녹음 자료는 16 비트를 사용합니다. 8 비트 소리가 끔찍한데 아무도 16에서 24 사이의 차이를들을 수는 없습니다.) –

0

한 가지 차이점은 타이슨의 RemoteIO 블로그 게시물은 리니어 PCM의 샘플 당 2 바이트를 사용한다는 것입니다. 따라서 이것은 형식이 호환되지 않는 오류 일 수 있습니다.

+0

형식에 대해 kAudioFormatFlagsAudioUnitCanonical을 설정 했으므로 이것이 왜 문제가되는지 잘 모르겠습니다. 플래그. 설명서에 이것이 8.24 비트 고정 소수점 형식임을 나타냅니다. – irtemed88

0

라인 bufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer));도 잘못되었습니다. AudioBuffer는 AudioBufferList보다 크기 때문에 메모리가 충분하지 않습니다.