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