AudioUnit 用法

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;

}



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值