gpt4 book ai didi

ios - 混音器 AudioUnit 到 RemoteIO AudioUnit

转载 作者:行者123 更新时间:2023-11-28 22:01:03 25 4
gpt4 key购买 nike

我有一个 AudioUnit,对应的回调正常工作,但现在,我需要将它发送到 RemoteIO,因为我正在实现一些需要 RemoteIO AudioUnit 才能工作的框架。

那么...我需要与此 audiounit 混音器相同的输出,但使用类型为 kAudioUnitSubType_RemoteIO 的另一个 audiounit。

请帮忙!

编辑...这是我正在尝试的代码......编辑 2- 添加了 iOUnitDescription

AudioComponentDescription iOUnitDescription;
iOUnitDescription.componentType = kAudioUnitType_Output;
iOUnitDescription.componentSubType = kAudioUnitSubType_RemoteIO;
iOUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
iOUnitDescription.componentFlags = 0;
iOUnitDescription.componentFlagsMask = 0;


AudioComponent foundIoUnitReference = AudioComponentFindNext (
NULL,
&iOUnitDescription
);
AudioComponentInstanceNew (
foundIoUnitReference,
&audioUnit
);

result = AudioUnitSetProperty (
audioUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
guitarBus,
&stereoStreamFormat,
sizeof (stereoStreamFormat)
);

if (noErr != result) {[self printErrorMessage: @"AudioUnitSetProperty (set mixer unit guitar input bus stream format)" withStatus: result];return;}
result = AudioUnitSetProperty (
audioUnit,
kAudioUnitProperty_SampleRate,
kAudioUnitScope_Output,
0,
&graphSampleRate,
sizeof (graphSampleRate)
);
if (noErr != result) {[self printErrorMessage: @"AudioUnitSetProperty (set AUDIOUNIT unit output stream format)" withStatus: result]; return;}


AudioUnitElement mixerUnitOutputBus = 0;
AudioUnitElement ioUnitOutputElement = 0;

AudioUnitConnection mixerOutToIoUnitIn;
mixerOutToIoUnitIn.sourceAudioUnit = mixerUnit;
mixerOutToIoUnitIn.sourceOutputNumber = mixerUnitOutputBus;
mixerOutToIoUnitIn.destInputNumber = ioUnitOutputElement;

AudioUnitSetProperty (
audioUnit, // connection destination
kAudioUnitProperty_MakeConnection, // property key
kAudioUnitScope_Input, // destination scope
ioUnitOutputElement, // destination element
&mixerOutToIoUnitIn, // connection definition
sizeof (mixerOutToIoUnitIn)
);

最佳答案

我真的需要更多信息。从上面,我看到你在某个地方有一个混音器,一个 guitarBus 大概是你的输入(并且看起来是一个流)。 &iOUnitDescription 的定义是什么。更重要的是,您将 renderCallback 连接到哪里,您在回调中做什么以及框架期望什么?

通常,当我需要处理音频时,我会构建自己的图表;为了更好的可移植性,我将其设为自己的类。这对您来说应该是一个很好的起点

下面是我如何实现这样的解决方案。

 // header file

@interface MDMixerGraph : NSObject{
AUGraph graph;
AudioUnit mixerUnit;
AudioUnit inputUnit;
AudioUnit rioUnit;
}
-(void) setupAUGraph;
@end

// implementation

@implementation MDMixerGraph

// exception Helper
void MDThrowOnError(OSStatus status){
if (status != noErr) {
@throw [NSException exceptionWithName:@"MDMixerException"
reason:[NSString stringWithFormat:@"Status Error %d).", (int)status]
userInfo:nil];
}
}


// helper method for setting up graph nodes
OSStatus MDAdAUGraphdNode(OSType inComponentType, OSType inComponentSubType, AUGraph inGraph, AUNode *outNode)
{
AudioComponentDescription desc;
desc.componentType = inComponentType;
desc.componentSubType = inComponentSubType;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
return AUGraphAddNode(inGraph, &desc, outNode);
}

// setup method to init and start AUGraph
-(void) setupAUGraph{

//Create the Graph
MDThrowOnError(NewAUGraph(&graph));

// setup AU Units
// Add Audio Units (Nodes) to the graph
AUNode inputNode, rioNode, mixerNode;

//Input Node -- this may need to be a different type to accept your Stream (not enough info above)
MDThrowOnError(MDAdAUGraphdNode(kAudioUnitType_Output, kAudioUnitSubType_RemoteIO, graph, &inputUnit));

//Remote IO Node - your output node
MDThrowOnError(MDAdAUGraphdNode(kAudioUnitType_Output, kAudioUnitSubType_RemoteIO, graph, &rioNode));

//mixerNode - Depending on output and input change the mixer sub-type here
// you can configure additional nodes depending on your needs for inputs and outputs
MDThrowOnError(MDAdAUGraphdNode(kAudioUnitType_Mixer, kAudioUnitSubType_AU3DMixerEmbedded, graph, &mixerNode));

// open graph
MDThrowOnError(AUGraphOpen(graph));

// we need a ref to the Audio Units so lets grab all of them here

MDThrowOnError(AUGraphNodeInfo(graph, inputNode, NULL, &inputUnit));
MDThrowOnError(AUGraphNodeInfo(graph, rioNode, NULL, &rioUnit));
MDThrowOnError(AUGraphNodeInfo(graph, mixerNode, NULL, &mixerUnit));

// setup the connections here, input to output of the graph.
/// the graph looks like inputNode->mixerNode->rioNode

MDThrowOnError(AUGraphConnectNodeInput(graph, inputNode, 0, mixerNode, 0));
MDThrowOnError(AUGraphConnectNodeInput(graph, mixerNode, 0, rioNode, 0));

// Init the graph

MDThrowOnError(AUGraphInitialize(graph));

//do any other setup here for your stream

// Finally, Start the graph

MDThrowOnError(AUGraphStart(graph));

}

在您的 View Controller 扩展中,您只需;

  // define the MDMixerGraph Class
// @property (nonatomic) MDMixerGraph *mixer;

并在执行中

  self.mixer = [[MDMixerGraph alloc]init];
[self.mixer setupAUGraph];

并且您引用了要传递给您的框架的 rioUnit (self.mixer.rioUnit);在不了解您的需求连接/处理的更多信息的情况下,这是我能为您做的最好的。

干杯!

关于ios - 混音器 AudioUnit 到 RemoteIO AudioUnit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25095528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com