首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用远程AudioUnit非常麻烦

使用远程AudioUnit非常麻烦
EN

Stack Overflow用户
提问于 2014-01-17 23:06:19
回答 1查看 268关注 0票数 0

最近我用remote IOUnit开发了一个项目,但是我遇到了一个奇怪的问题,iphone5(ios7)上的声音总是很嘈杂。我无法理解,因为它在iPod(ios6)上工作得很好。iphone5的扬声器经常产生噪声,但在耳机内工作正常。有人能帮我吗?

下面是代码。

代码语言:javascript
复制
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
   [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord
                  withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker
                        error:nil];
  success = [[AVAudioSession sharedInstance] setActive:YES
                                     error:&error];
if (!success) {
    [self checkError:error];
}

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

代码语言:javascript
复制
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 );
EN

回答 1

Stack Overflow用户

发布于 2014-02-05 09:14:14

试着用"kAudioUnitSubType_RemoteIO“代替"kAudioUnitSubType_VoiceProcessingIO”

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21189108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档