/// <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());
                }
            }
        }
Exemplo n.º 2
0
        /// <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]);
        }
Exemplo n.º 3
0
        /// <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);
        }