2014-01-17 3 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

Try "kAudioUnitSubType_RemoteIO" вместо "kAudioUnitSubType_VoiceProcessingIO"