2014-01-17 27 views
0

最近我開發了一個遠程IOUnit的項目,但我遇到了一個奇怪的問題,iPhone5(ios7)上的聲音總是嘈雜。我無法理解,因爲它在iPod(ios6)上運行良好。 iphone5的揚聲器總是會產生噪音,而在耳機內效果很好。 請有人可以幫我使用遠程AudioUnit非常嘈雜

這裏是代碼。

AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord 
        withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker 
         error:nil]; 
    success = [[AVAudioSession sharedInstance] setActive:YES 
            error:&error]; 
if (!success) { 
    [self checkError:error]; 
} 

==============

AudioComponentDescription audioDesc; 
audioDesc.componentType = kAudioUnitType_Output; 
audioDesc.componentSubType = kAudioUnitSubType_VoiceProcessingIO; 
audioDesc.componentFlags = 0; 
audioDesc.componentFlagsMask = 0; 
audioDesc.componentManufacturer = kAudioUnitManufacturer_Apple; 

OSStatus status = noErr; 
AudioComponent inputComponent = AudioComponentFindNext(NULL, &audioDesc); 
status = AudioComponentInstanceNew(inputComponent, &_audioUnit); 
checkstatus(status); 
if (status) { 
    return NO; 
} 

UInt32 flag = 1; 
// Enable IO for recording 
status = AudioUnitSetProperty(_audioUnit, 
           kAudioOutputUnitProperty_EnableIO, 
           kAudioUnitScope_Input, 
           kInputBus, 
           &flag, 
           sizeof(flag)); 
checkstatus(status); 

// Enable IO for playback 
status = AudioUnitSetProperty(_audioUnit, 
           kAudioOutputUnitProperty_EnableIO, 
           kAudioUnitScope_Output, 
           kOutputBus, 
           &flag, 
           sizeof(flag)); 
checkstatus(status); 

// Describe format 
audioFormat.mSampleRate   = 8000; 
audioFormat.mFormatID   = kAudioFormatLinearPCM; 
audioFormat.mFormatFlags  = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
audioFormat.mFramesPerPacket = 1; 
audioFormat.mChannelsPerFrame = 1; 
audioFormat.mBitsPerChannel  = 16;//short 
audioFormat.mBytesPerPacket  = 2; 
audioFormat.mBytesPerFrame  = 2; 


// Apply format 

status = AudioUnitSetProperty(_audioUnit, 
           kAudioUnitProperty_StreamFormat, 
           kAudioUnitScope_Output, 
           kInputBus, 
           &audioFormat, 
           sizeof(audioFormat)); 
checkstatus(status); 

status = AudioUnitSetProperty(_audioUnit, 
           kAudioUnitProperty_StreamFormat, 
           kAudioUnitScope_Input, 
           kOutputBus, 
           &audioFormat, 
           sizeof(audioFormat)); 
checkstatus(status); 


// Set input callback 
AURenderCallbackStruct callbackStruct; 
callbackStruct.inputProc = recordingCallback; 
callbackStruct.inputProcRefCon = (__bridge void *)(self); 
status = AudioUnitSetProperty(_audioUnit, 
           kAudioOutputUnitProperty_SetInputCallback, 
           kAudioUnitScope_Input, 
           kInputBus, 
           &callbackStruct, 
           sizeof(callbackStruct)); 

// Set output callback 
callbackStruct.inputProc = playbackCallback; 
callbackStruct.inputProcRefCon = (__bridge void *)(self); 
status = AudioUnitSetProperty(_audioUnit, 
           kAudioUnitProperty_SetRenderCallback, 
           kAudioUnitScope_Output, 
           kOutputBus, 
           &callbackStruct, 
           sizeof(callbackStruct)); 
checkstatus(status); 

// Disable buffer allocation for the recorder (optional - do this if we want to pass in our own) 
flag = 0; 
status = AudioUnitSetProperty(_audioUnit, 
           kAudioUnitProperty_ShouldAllocateBuffer, 
           kAudioUnitScope_Output, 
           kInputBus, 
           &flag, 
           sizeof(flag)); 
checkstatus(status); 

if (status) { 
    return NO; 
} 

_m_inBufferList = (AudioBufferList *)malloc(sizeof(AudioBufferList) + sizeof(AudioBuffer)); 
_m_inBufferList->mNumberBuffers = 1; 
_m_inBufferList->mBuffers[0].mNumberChannels = 1; 
_m_inBufferList->mBuffers[0].mDataByteSize = 320 * 2; 
_m_inBufferList->mBuffers[0].mData = malloc(320 * 2); 

回答

0

試試 「kAudioUnitSubType_RemoteIO」,而不是 「kAudioUnitSubType_VoiceProcessingIO」