/// <summary> /// Adds an audio compressor if needed (by checking the registry) /// </summary> public void AddAudioCompressor() { FilterInfo compressor = AudioCapability.SelectedCompressor(); if (compressor.Moniker != "Uncompressed") { try { cg.AddCompressor(SelectedCompressor()); Log(cg.Compressor.Dump()); IAudioCaptureGraph iacg = cg as IAudioCaptureGraph; Dictionary <string, Object> args = new Dictionary <string, object>(); args.Add("CaptureGraph", cg); args.Add("CompressionMediaTypeIndex", this.CompressionMediaTypeIndex); iacg.AudioCompressor.PostConnectConfig(args); } catch (Exception e) { // If we encounter an error trying to add or configure the // compressor, just disable compressor and log it //RegAudioCompressorEnabled = false; Log(e.ToString()); } } }
/// <summary> /// By default, we use the Windows Media Audio V2 compressor /// </summary> private void DefaultAudioCompressorSettings() { Debug.Assert(AudioCompressor.DefaultName == "Windows Media Audio V2"); IAudioCaptureGraph iacg = cg as IAudioCaptureGraph; iacg.AudioCompressor.SetMediaType(iacg.AudioCompressor.PreConnectMediaTypes[this.CompressionMediaTypeIndex]); }
/// <summary> /// Configure the Opus encoder filter /// after the encoder is in the graph and connected /// to the source. /// /// Warning: This might not work for a DVCaptureGraph. /// </summary> /// <param name="cg"></param> /// <param name="j"></param> public override void PostConnectConfig(Dictionary <string, Object> args) { CaptureGraph cg = args["CaptureGraph"] as CaptureGraph; IAudioCaptureGraph iacg = cg as IAudioCaptureGraph; _AMMediaType[] mts = Pin.GetMediaTypes(cg.Source.OutputPin); bool mtSet = false; foreach (_AMMediaType mt in mts) { WAVEFORMATEX wfex = (WAVEFORMATEX)MediaType.FormatType.MarshalData(mt); if ((wfex.SamplesPerSec == Frequency) && (wfex.Channels == Channels) && (wfex.BitsPerSample == Depth)) { cg.Source.SetMediaType(mt); mtSet = true; break; } } if (!mtSet) { throw new ApplicationException("The audio device doesn't support the configured values of SamplesPerSec/Channels/BitsPerSample."); } IOpusEncoderCtl iOpus = (IOpusEncoderCtl)iacg.AudioCompressor.BaseFilter; iOpus.SetSignal(Signal); int br = BitRate; if (br == 0) { br = ManualBitRate; } iOpus.SetBitRate(br); iOpus.SetComplexity(Complexity); iOpus.SetMaxBandwidth(MaxBandwidth); iOpus.SetVbr(VBR); iOpus.SetVbrConstraint(VBRConstraint); iOpus.SetDtx(DTX); iOpus.SetPacketLossPerc(PacketLossPerc); iOpus.SetLsbDepth(LSBDepth); iOpus.SetForcedChannels(ForcedChannels); }