美文网首页iOS开发
AudioUnit基础概念

AudioUnit基础概念

作者: 当AI已成往事55 | 来源:发表于2016-04-16 09:11 被阅读1394次

    1、描述音频单元

    AudioComponentDescription desc;

    desc.componentType = kAudioUnitType_Output;

    desc.componentSubType = kAudioUnitSubType_RemoteIO;

    desc.componentFlags = 0;

    desc.componentFlagsMask = 0;

    desc.componentManufacturer = kAudioUnitManufacturer_Apple;

    2、查找音频单元

    AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);

    3、获取音频单元实例

    status = AudioComponentInstanceNew(inputComponent, &audioUnit);

    4、启用录制功能、启用播放功能

    UInt32 flag = 1;

    status = AudioUnitSetProperty(audioUnit,

    kAudioOutputUnitProperty_EnableIO,

    kAudioUnitScope_Input,

    kInputBus,

    &flag,

    sizeof(flag));

    status = AudioUnitSetProperty(audioUnit,

    kAudioOutputUnitProperty_EnableIO,

    kAudioUnitScope_Output,

    kOutputBus,

    &flag,

    sizeof(flag));

    5、音频流描述

    AudioStreamBasicDescription audioFormat;

    audioFormat.mSampleRate

    = 44100.00;

    audioFormat.mFormatID

    = kAudioFormatLinearPCM;

    audioFormat.mFormatFlags

    = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;

    audioFormat.mFramesPerPacket

    = 1;

    audioFormat.mChannelsPerFrame

    = 1;

    audioFormat.mBitsPerChannel

    = 16;

    audioFormat.mBytesPerPacket

    = 2;

    audioFormat.mBytesPerFrame

    = 2;

    6、应用录制和播放的音频流描述

    status = AudioUnitSetProperty(audioUnit,

    kAudioUnitProperty_StreamFormat,

    kAudioUnitScope_Output,

    kInputBus,

    &audioFormat,

    sizeof(audioFormat));

    status = AudioUnitSetProperty(audioUnit,

    kAudioUnitProperty_StreamFormat,

    kAudioUnitScope_Input,

    kOutputBus,

    &audioFormat,

    sizeof(audioFormat));

    7、设置回调

    AURenderCallbackStruct callbackStruct;

    callbackStruct.inputProc = recordingCallback;

    callbackStruct.inputProcRefCon = self;

    status = AudioUnitSetProperty(audioUnit,

    kAudioOutputUnitProperty_SetInputCallback,

    kAudioUnitScope_Global,

    kInputBus,

    &callbackStruct,

    sizeof(callbackStruct));

    callbackStruct.inputProc = playbackCallback;

    callbackStruct.inputProcRefCon = self;

    status = AudioUnitSetProperty(audioUnit,

    kAudioUnitProperty_SetRenderCallback,

    kAudioUnitScope_Global,

    kOutputBus,

    &callbackStruct,

    sizeof(callbackStruct));

    8、回调方法

    static OSStatus recordingCallback(void *inRefCon,

    AudioUnitRenderActionFlags *ioActionFlags,

    const AudioTimeStamp *inTimeStamp,

    UInt32 inBusNumber,

    UInt32 inNumberFrames,

    AudioBufferList *ioData) {

    AudioBufferList *bufferList;

    OSStatus status = AudioUnitRender([(shockmanViewController *)inRefCon audioUnit],

    ioActionFlags,

    inTimeStamp,

    inBusNumber,

    inNumberFrames,

    bufferList);

    return noErr;

    }

    static OSStatus playbackCallback(void *inRefCon,

    AudioUnitRenderActionFlags *ioActionFlags,

    const AudioTimeStamp *inTimeStamp,

    UInt32 inBusNumber,

    UInt32 inNumberFrames,

    AudioBufferList *ioData) {

    return noErr;

    }

    相关文章

      网友评论

        本文标题:AudioUnit基础概念

        本文链接:https://www.haomeiwen.com/subject/mmnnlttx.html