81 lines
2.4 KiB
C#
81 lines
2.4 KiB
C#
|
using System;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
using NAudio.CoreAudioApi.Interfaces;
|
|||
|
|
|||
|
namespace NAudio.Dmo
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// From wmcodecsdp.h
|
|||
|
/// Implements:
|
|||
|
/// - IMediaObject
|
|||
|
/// - IMFTransform (Media foundation - we will leave this for now as there is loads of MF stuff)
|
|||
|
/// - IPropertyStore
|
|||
|
/// - IWMResamplerProps
|
|||
|
/// Can resample PCM or IEEE
|
|||
|
/// </summary>
|
|||
|
[ComImport, Guid("f447b69e-1884-4a7e-8055-346f74d6edb3")]
|
|||
|
class ResamplerMediaComObject
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// DMO Resampler
|
|||
|
/// </summary>
|
|||
|
public class DmoResampler : IDisposable
|
|||
|
{
|
|||
|
MediaObject mediaObject;
|
|||
|
IPropertyStore propertyStoreInterface;
|
|||
|
IWMResamplerProps resamplerPropsInterface;
|
|||
|
ResamplerMediaComObject mediaComObject;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates a new Resampler based on the DMO Resampler
|
|||
|
/// </summary>
|
|||
|
public DmoResampler()
|
|||
|
{
|
|||
|
mediaComObject = new ResamplerMediaComObject();
|
|||
|
mediaObject = new MediaObject((IMediaObject)mediaComObject);
|
|||
|
propertyStoreInterface = (IPropertyStore)mediaComObject;
|
|||
|
resamplerPropsInterface = (IWMResamplerProps)mediaComObject;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Media Object
|
|||
|
/// </summary>
|
|||
|
public MediaObject MediaObject => mediaObject;
|
|||
|
|
|||
|
#region IDisposable Members
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Dispose code - experimental at the moment
|
|||
|
/// Was added trying to track down why Resampler crashes NUnit
|
|||
|
/// This code not currently being called by ResamplerDmoStream
|
|||
|
/// </summary>
|
|||
|
public void Dispose()
|
|||
|
{
|
|||
|
if(propertyStoreInterface != null)
|
|||
|
{
|
|||
|
Marshal.ReleaseComObject(propertyStoreInterface);
|
|||
|
propertyStoreInterface = null;
|
|||
|
}
|
|||
|
if(resamplerPropsInterface != null)
|
|||
|
{
|
|||
|
Marshal.ReleaseComObject(resamplerPropsInterface);
|
|||
|
resamplerPropsInterface = null;
|
|||
|
}
|
|||
|
if (mediaObject != null)
|
|||
|
{
|
|||
|
mediaObject.Dispose();
|
|||
|
mediaObject = null;
|
|||
|
}
|
|||
|
if (mediaComObject != null)
|
|||
|
{
|
|||
|
Marshal.ReleaseComObject(mediaComObject);
|
|||
|
mediaComObject = null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|