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) {
    // This is a mono tone generator so we only need the first buffer
    UInt16 *buffer = (SAMPLE *)ioData->mBuffers[0].mData;
    // Generate the samples
    for (UInt32 frame = 0; frame < inNumberFrames; frame++)
    {
        if(THIS->isPlaying) {
    // 通过修改buffer数组的值,输出自己的音频数据
            buffer[frame] = audioProtocol.getEncode()[THIS->qIndex++];            
            if(THIS->qIndex >= THIS->qSize) {
                //[THIS stopToPlay];
                [THIS performSelectorOnMainThread:@selector(stopToPlay) withObject:nil waitUntilDone:NO];
                break;
            }
        }
    }

    return noErr;

}

  

Unit property是指在音频单元(Audio Unit)中定义的属性或行为,用于控制和调整音频处理的各种参数和特性。在音频单元中,可以使用属性结构体(AudioUnitProperty)来存储和管理这些属性的信息。属性结构体包括音频单元(AudioUnit)、属性ID(AudioUnitPropertyID)、作用范围(AudioUnitScope)和元素(AudioUnitElement)等信息。通过定义属性结构体,可以提供属性的Setter和Getter方法来设置和获取相应的属性值。此外,还可以使用属性监听器(callback function),通过注册和移除监听器函数来监测属性值的变化。使用函数AudioUnitRemovePropertyListenerWithUserData可以移除先前注册的属性监听器回调函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [unity编辑器扩展#1 自定义窗口、面板、和属性](https://blog.csdn.net/qq_38275140/article/details/84778266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [音频单元组件服务参考(Audio Unit Component Services Reference)](https://blog.csdn.net/weixin_30892889/article/details/99246085)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值