예제 #1
0
        internal AudioCapabilities(IAMStreamConfig audioStreamConfig)
        {
            if (audioStreamConfig == null)
            {
                throw new ArgumentNullException("audioStreamConfig");
            }
            AMMediaType           mediaType = null;
            AudioStreamConfigCaps caps      = null;
            IntPtr zero = IntPtr.Zero;

            try
            {
                IntPtr ptr2;
                int    num;
                int    num2;
                int    numberOfCapabilities = audioStreamConfig.GetNumberOfCapabilities(out num, out num2);
                if (numberOfCapabilities != 0)
                {
                    Marshal.ThrowExceptionForHR(numberOfCapabilities);
                }
                if (num <= 0)
                {
                    throw new NotSupportedException("This audio device does not report capabilities.");
                }
                if (num2 > Marshal.SizeOf(typeof(AudioStreamConfigCaps)))
                {
                    throw new NotSupportedException("Unable to retrieve audio device capabilities. This audio device requires a larger AudioStreamConfigCaps structure.");
                }
                zero = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(AudioStreamConfigCaps)));
                numberOfCapabilities = audioStreamConfig.GetStreamCaps(0, out ptr2, zero);
                if (numberOfCapabilities != 0)
                {
                    Marshal.ThrowExceptionForHR(numberOfCapabilities);
                }
                mediaType                    = (AMMediaType)Marshal.PtrToStructure(ptr2, typeof(AMMediaType));
                caps                         = (AudioStreamConfigCaps)Marshal.PtrToStructure(zero, typeof(AudioStreamConfigCaps));
                this.MinimumChannels         = caps.MinimumChannels;
                this.MaximumChannels         = caps.MaximumChannels;
                this.ChannelsGranularity     = caps.ChannelsGranularity;
                this.MinimumSampleSize       = caps.MinimumBitsPerSample;
                this.MaximumSampleSize       = caps.MaximumBitsPerSample;
                this.SampleSizeGranularity   = caps.BitsPerSampleGranularity;
                this.MinimumSamplingRate     = caps.MinimumSampleFrequency;
                this.MaximumSamplingRate     = caps.MaximumSampleFrequency;
                this.SamplingRateGranularity = caps.SampleFrequencyGranularity;
            }
            finally
            {
                if (zero != IntPtr.Zero)
                {
                    Marshal.FreeCoTaskMem(zero);
                }
                zero = IntPtr.Zero;
                if (mediaType != null)
                {
                    DsUtils.FreeAMMediaType(mediaType);
                }
                mediaType = null;
            }
        }
예제 #2
0
        void TestStreamCaps()
        {
            int         hr;
            IntPtr      pss;
            AMMediaType pmt;
            int         iCount, iSize;

            hr = m_asc.GetNumberOfCapabilities(out iCount, out iSize);
            DsError.ThrowExceptionForHR(hr);

            pss = Marshal.AllocCoTaskMem(iCount * iSize);
            DsError.ThrowExceptionForHR(hr);

            if (iSize == Marshal.SizeOf(typeof(VideoStreamConfigCaps)))
            {
                for (int x = 0; x < iCount; x++)
                {
                    hr = m_asc.GetStreamCaps(x, out pmt, pss);
                    DsError.ThrowExceptionForHR(hr);

                    VideoStreamConfigCaps vscc = (VideoStreamConfigCaps)Marshal.PtrToStructure(pss, typeof(VideoStreamConfigCaps));
                    pss = (IntPtr)(pss.ToInt64() + Marshal.SizeOf(typeof(VideoStreamConfigCaps)));
                }
            }
            else if (iSize == Marshal.SizeOf(typeof(AudioStreamConfigCaps)))
            {
                for (int x = 0; x < iCount; x++)
                {
                    hr = m_asc.GetStreamCaps(x, out pmt, pss);
                    DsError.ThrowExceptionForHR(hr);

                    AudioStreamConfigCaps vscc = (AudioStreamConfigCaps)Marshal.PtrToStructure(pss, typeof(AudioStreamConfigCaps));
                    pss = (IntPtr)(pss.ToInt64() + Marshal.SizeOf(typeof(AudioStreamConfigCaps)));
                }
            }
            else
            {
                Debug.Assert(false, "GetStreamCaps");
            }

            Marshal.FreeCoTaskMem(pss);
        }
예제 #3
0
        // ----------------- Constructor ---------------------

        /// <summary> Retrieve capabilities of an audio device </summary>
        internal AudioCapabilities(IAMStreamConfig audioStreamConfig)
        {
            if (audioStreamConfig == null)
            {
                throw new ArgumentNullException("audioStreamConfig");
            }

            AMMediaType           mediaType = null;
            AudioStreamConfigCaps caps      = null;
            IntPtr pCaps = IntPtr.Zero;
            IntPtr pMediaType;

            try
            {
                // Ensure this device reports capabilities
                int c, size;
                int hr = audioStreamConfig.GetNumberOfCapabilities(out c, out size);
                if (hr != 0)
                {
                    Marshal.ThrowExceptionForHR(hr);
                }
                if (c <= 0)
                {
                    throw new NotSupportedException("This audio device does not report capabilities.");
                }
                if (size > Marshal.SizeOf(typeof(AudioStreamConfigCaps)))
                {
                    throw new NotSupportedException("Unable to retrieve audio device capabilities. This audio device requires a larger AudioStreamConfigCaps structure.");
                }
                if (c > 1)
                {
                    Debug.WriteLine("WARNING: This audio device supports " + c + " capability structures. Only the first structure will be used.");
                }

                // Alloc memory for structure
                pCaps = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(AudioStreamConfigCaps)));

                // Retrieve first (and hopefully only) capabilities struct
                hr = audioStreamConfig.GetStreamCaps(0, out pMediaType, pCaps);
                if (hr != 0)
                {
                    Marshal.ThrowExceptionForHR(hr);
                }

                // Convert pointers to managed structures
                mediaType = (AMMediaType)Marshal.PtrToStructure(pMediaType, typeof(AMMediaType));
                caps      = (AudioStreamConfigCaps)Marshal.PtrToStructure(pCaps, typeof(AudioStreamConfigCaps));

                // Extract info
                MinimumChannels         = caps.MinimumChannels;
                MaximumChannels         = caps.MaximumChannels;
                ChannelsGranularity     = caps.ChannelsGranularity;
                MinimumSampleSize       = caps.MinimumBitsPerSample;
                MaximumSampleSize       = caps.MaximumBitsPerSample;
                SampleSizeGranularity   = caps.BitsPerSampleGranularity;
                MinimumSamplingRate     = caps.MinimumSampleFrequency;
                MaximumSamplingRate     = caps.MaximumSampleFrequency;
                SamplingRateGranularity = caps.SampleFrequencyGranularity;
            }
            finally
            {
                if (pCaps != IntPtr.Zero)
                {
                    Marshal.FreeCoTaskMem(pCaps);
                }
                pCaps = IntPtr.Zero;
                if (mediaType != null)
                {
                    CommonUtils.FreeAMMediaType(mediaType);
                }
                mediaType = null;
            }
        }
        private (LocalAudioSourceCapability[] caps, bool success) GetCapabilities(DsDevice device)
        {
            Log.Information($"Audio ({device.Name}): Getting Caps");
            var list = new List <LocalAudioSourceCapability>();

            bool failed = false;

            IntPtr pCaps = IntPtr.Zero;

            IFilterGraph2   filterGraph2 = null;
            IBaseFilter     sourceFilter = null;
            IAMStreamConfig streamConfig = null;
            object          pin          = null;
            int             count        = 0;
            int             size         = 0;

            try
            {
                filterGraph2 = new FilterGraph() as IFilterGraph2;
                if (filterGraph2 == null)
                {
                    throw new NotSupportedException("filter2 is null");
                }

                LocalVideoSourceManager.AddCaptureFilter(filterGraph2, device, out sourceFilter);

                pin = DsFindPin.ByCategory(sourceFilter, PinCategory.Capture, 0);

                if (pin == null)
                {
                    Log.Information($"Audio ({device.Name}): First pin is null");
                    pin = sourceFilter;
                }

                streamConfig = pin as IAMStreamConfig;
                if (streamConfig == null)
                {
                    throw new NotSupportedException("pin is null");
                }

                LocalVideoSourceManager.Checked(() => streamConfig.GetNumberOfCapabilities(out count, out size), "GetNumberOfCapabilities", null);
                if (count <= 0)
                {
                    throw new NotSupportedException("This video source does not report capabilities.");
                }
                if (size != Marshal.SizeOf(typeof(AudioStreamConfigCaps)))
                {
                    throw new NotSupportedException("Unable to retrieve video source capabilities. This video source requires a larger VideoStreamConfigCaps structure.");
                }

                // Alloc memory for structure
                pCaps = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(AudioStreamConfigCaps)));

                for (int i = 0; i < count; i++)
                {
                    AMMediaType mediaType = null;
                    LocalVideoSourceManager.Checked(() => streamConfig.GetStreamCaps(i, out mediaType, pCaps), "GetStreamCaps", null);

                    AudioStreamConfigCaps caps = (AudioStreamConfigCaps)Marshal.PtrToStructure(pCaps, typeof(AudioStreamConfigCaps));

                    var result = new LocalAudioSourceCapability()
                    {
                        MinimumChannels        = caps.MinimumChannels,
                        MaximumChannels        = caps.MaximumChannels,
                        MinimumSampleFrequency = caps.MinimumSampleFrequency,
                        MaximumSampleFrequency = caps.MaximumSampleFrequency
                    };

                    list.Add(result);
                }
            }
            catch (Exception e)
            {
                Log.Error(e, $"Error during retreiving caps for '{device.Name}'");
                failed = true;
            }
            finally
            {
                if (pCaps != IntPtr.Zero)
                {
                    Marshal.FreeCoTaskMem(pCaps);
                }
            }

            Log.Information($"Audio ({device.Name}): Releasing");

            try
            {
                LocalVideoSourceManager.ReleaseComObject(sourceFilter);
                LocalVideoSourceManager.ReleaseComObject(filterGraph2);
                LocalVideoSourceManager.ReleaseComObject(streamConfig);
                LocalVideoSourceManager.ReleaseComObject(pin);
            }
            catch (Exception e)
            {
                Log.Error(e, $"ReleaseComObject({device.Name}) failed");
            }

            Log.Information($"Caps {device.Name}: Count: {list.Count}/{count}, Str={size} ({string.Join("; ", list.Where(s => !s.IsStandart()).Select(s => s.ToString()))})");

            return(list.ToArray(), !failed);
        }
예제 #5
0
        /// <summary> Запрашивает возможности аудиоустройства </summary>
        internal AudioCapabilities(IAMStreamConfig audioStreamConfig)
        {
            if (audioStreamConfig == null)
            {
                throw new ArgumentNullException(nameof(audioStreamConfig));
            }

            AMMediaType           mediaType = null;
            AudioStreamConfigCaps caps      = null;
            IntPtr pCaps = IntPtr.Zero;
            IntPtr pMediaType;

            try
            {
                //Проверка того, что устройство может выдавать свои аудиовозможности
                int c, size;
                int hr = audioStreamConfig.GetNumberOfCapabilities(out c, out size);
                if (hr != 0)
                {
                    Marshal.ThrowExceptionForHR(hr);
                }
                if (c <= 0)
                {
                    throw new NotSupportedException("This audio device does not report capabilities.");
                }
                if (size > Marshal.SizeOf(typeof(AudioStreamConfigCaps)))
                {
                    throw new NotSupportedException("Unable to retrieve audio device capabilities. This audio device requires a larger AudioStreamConfigCaps structure.");
                }
                if (c > 1)
                {
                    Debug.WriteLine("WARNING: This audio device supports " + c + " capability structures. Only the first structure will be used.");
                }

                //Выделение памяти для структуры
                pCaps = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(AudioStreamConfigCaps)));

                // Запрос первой структуры с аудиовозможностями
                hr = audioStreamConfig.GetStreamCaps(0, out pMediaType, pCaps);
                if (hr != 0)
                {
                    Marshal.ThrowExceptionForHR(hr);
                }

                //Каст указателей в управляемые ресурсы
                mediaType = (AMMediaType)Marshal.PtrToStructure(pMediaType, typeof(AMMediaType));
                caps      = (AudioStreamConfigCaps)Marshal.PtrToStructure(pCaps, typeof(AudioStreamConfigCaps));

                // Извлечение информации
                MinimumChannels         = caps.MinimumChannels;
                MaximumChannels         = caps.MaximumChannels;
                ChannelsGranularity     = caps.ChannelsGranularity;
                MinimumSampleSize       = caps.MinimumBitsPerSample;
                MaximumSampleSize       = caps.MaximumBitsPerSample;
                SampleSizeGranularity   = caps.BitsPerSampleGranularity;
                MinimumSamplingRate     = caps.MinimumSampleFrequency;
                MaximumSamplingRate     = caps.MaximumSampleFrequency;
                SamplingRateGranularity = caps.SampleFrequencyGranularity;
            }
            finally
            {
                if (pCaps != IntPtr.Zero)
                {
                    Marshal.FreeCoTaskMem(pCaps);
                }
                pCaps = IntPtr.Zero;
                if (mediaType != null)
                {
                    DsUtils.FreeAMMediaType(mediaType);
                }
                mediaType = null;
            }
        }
        /// <summary> Retrieve capabilities of an audio device </summary>
        internal AudioCapabilities(IAMStreamConfig audioStreamConfig)
        {
            if (audioStreamConfig == null)
            {
                throw new ArgumentNullException("audioStreamConfig");
            }

            AMMediaType           mediaType = null;
            AudioStreamConfigCaps caps      = null;
            IntPtr pCaps = IntPtr.Zero;

            try
            {
                // Ensure this device reports capabilities
                IntPtr pMediaType;
                int    piCount;
                int    piSize;

                int numberOfCapabilities = audioStreamConfig.GetNumberOfCapabilities(out piCount, out piSize);
                if (numberOfCapabilities != 0)
                {
                    Marshal.ThrowExceptionForHR(numberOfCapabilities);
                }
                if (piCount <= 0)
                {
                    throw new NotSupportedException("This audio device does not report capabilities.");
                }
                if (piSize > Marshal.SizeOf(typeof(AudioStreamConfigCaps)))
                {
                    throw new NotSupportedException("Unable to retrieve audio device capabilities. This audio device requires a larger AudioStreamConfigCaps structure.");
                }

                // Alloc memory for structure
                pCaps = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(AudioStreamConfigCaps)));

                // Retrieve first (and hopefully only) capabilities struct
                numberOfCapabilities = audioStreamConfig.GetStreamCaps(0, out pMediaType, pCaps);
                if (numberOfCapabilities != 0)
                {
                    Marshal.ThrowExceptionForHR(numberOfCapabilities);
                }

                // Convert pointers to managed structures
                mediaType = (AMMediaType)Marshal.PtrToStructure(pMediaType, typeof(AMMediaType));
                caps      = (AudioStreamConfigCaps)Marshal.PtrToStructure(pCaps, typeof(AudioStreamConfigCaps));

                // Extract info
                this.MinimumChannels         = caps.MinimumChannels;
                this.MaximumChannels         = caps.MaximumChannels;
                this.ChannelsGranularity     = caps.ChannelsGranularity;
                this.MinimumSampleSize       = caps.MinimumBitsPerSample;
                this.MaximumSampleSize       = caps.MaximumBitsPerSample;
                this.SampleSizeGranularity   = caps.BitsPerSampleGranularity;
                this.MinimumSamplingRate     = caps.MinimumSampleFrequency;
                this.MaximumSamplingRate     = caps.MaximumSampleFrequency;
                this.SamplingRateGranularity = caps.SampleFrequencyGranularity;
            }
            finally
            {
                if (pCaps != IntPtr.Zero)
                {
                    Marshal.FreeCoTaskMem(pCaps);
                }
                pCaps = IntPtr.Zero;
                if (mediaType != null)
                {
                    DsUtils.FreeAMMediaType(mediaType);
                }
                mediaType = null;
            }
        }