2017-07-09 89 views
0

我試圖在Xamarin.Mac項目中得到以下示例。 這是一個AUGraph,它將混音器連接到默認輸出。該混音器有一個輸入是一個渲染回調,產生一個正弦波。在Xamarin.Mac中使用AUGraph

 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(); 
     } 

回調:

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不播放聲音。有任何想法嗎?

回答

0

調音臺的輸出音量必須手動設置,因爲它默認爲0.