首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Xamarin.Mac中使用AUGraph

在Xamarin.Mac中使用AUGraph
EN

Stack Overflow用户
提问于 2017-07-09 12:00:49
回答 1查看 37关注 0票数 0

我正在尝试让下面的示例在Xamarin.Mac项目中工作。它是一个将混音器连接到默认输出的AUGraph。混音器有一个输入,它是一个生成正弦波的渲染回调。

代码语言:javascript
复制
        var graph = new AUGraph();

        var output = graph.AddNode(AudioComponentDescription.CreateOutput(AudioTypeOutput.Default));

        var mixer = graph.AddNode(AudioComponentDescription.CreateMixer(AudioTypeMixer.MultiChannel));

        if (graph.TryOpen() != 0)
        {
            throw new Exception();
        }

        var mixNode = graph.GetNodeInfo(mixer);

        // configure mixer
        if (mixNode.SetElementCount(AudioUnitScopeType.Input, 1) != AudioUnitStatus.OK)
        {
            throw new Exception();
        }

        if (mixNode.SetRenderCallback(HandleRenderDelegate, AudioUnitScopeType.Global, 0) != AudioUnitStatus.OK)
        {
            throw new Exception();
        }

        var outNode = graph.GetNodeInfo(output);

        // define stream description
        var desc = new AudioStreamBasicDescription();
        desc.BitsPerChannel = 32;
        desc.BytesPerFrame = 4;
        desc.BytesPerPacket = 4;
        desc.Format = AudioFormatType.LinearPCM;
        desc.FormatFlags = AudioStreamBasicDescription.AudioFormatFlagsAudioUnitNativeFloat;
        desc.FramesPerPacket = 1;
        desc.ChannelsPerFrame = 2;
        desc.SampleRate = 44100;

        // set mixer input format
        if (mixNode.SetFormat(desc, AudioUnitScopeType.Input, 0) != AudioUnitStatus.OK)
        {
            throw new Exception();
        }

        // connect mixer's output to the output
        if (graph.ConnnectNodeInput(mixer, 0, output, 0) != AUGraphError.OK)
        {
            throw new Exception();
        }

        // set format of mixer's output
        desc = mixNode.GetAudioFormat(AudioUnitScopeType.Output);

        desc.SampleRate = 44100;

        if (outNode.SetFormat(desc, AudioUnitScopeType.Input,0) != AudioUnitStatus.OK)
        {
            throw new Exception();
        }

        if (mixNode.SetFormat(desc, AudioUnitScopeType.Output) != AudioUnitStatus.OK)
        {
            throw new Exception();
        }

        if (graph.Initialize() != AUGraphError.OK)
        {
            throw new Exception();
        }

        if (graph.Start() != AUGraphError.OK)
        {
            throw new Exception();
        }

回调:

代码语言:javascript
复制
int sample = 0;

unsafe AudioUnitStatus HandleRenderDelegate(AudioUnitRenderActionFlags actionFlags, AudioTimeStamp timeStamp, uint busNumber, uint numberFrames, AudioBuffers data)
{
    var left = (float*)data[0].Data;
    var right = (float*)data[1].Data;

    for (var i = 0; i < numberFrames; i++)
    {
        float sampleValue = (float)Math.Sin(sample * 2 * Math.PI * 440 / 44100);
        left[i] = right[i] = sampleValue;
        sample++;
    }
    return AudioUnitStatus.OK;
}

回调正在运行,缓冲区正在填充,但没有声音生成。该示例在iOS中工作,使用AudioTypeOutput.Remote代替AudioTypeOutput.Default,但是由于某种原因,macOS不能播放声音。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2017-07-10 09:18:25

混音器的输出音量必须手动设置,因为它的默认值为0。

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

https://stackoverflow.com/questions/44992846

复制
相关文章

相似问题

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