public HResult GetEvent(MFEventFlag dwFlags, out IMFMediaEvent ppEvent) { Debug.WriteLine("StreamSink:GetEvent"); HResult hr; IMFMediaEventQueueAlt queue = null; ppEvent = null; lock (this) { hr = CheckShutdown(); LogIfFailed(hr); if (Succeeded(hr)) { GenEventQueue(); queue = EventQueue; Marshal.AddRef(Marshal.GetIUnknownForObject(queue)); } } if (Succeeded(hr)) { hr = queue.GetEvent(dwFlags, out ppEvent); LogIfFailed(hr); } SafeRelease(queue); return(hr); }
int m_WorkQueueId; // ID of the work queue for asynchronous operations. #endregion Fields #region Constructors public CWavStream(CWavSink pParent, IMFByteStream pByteStream) { int hr; TRACE("CWavStream::CWavStream"); m_SampleQueue = new Queue(); m_state = State.TypeNotSet; m_IsShutdown = false; m_pSink = null; m_pEventQueue = null; m_pByteStream = null; m_pCurrentType = null; m_pFinalizeResult = null; m_StartTime = 0; m_cbDataWritten = 0; m_WorkQueueId = 0; Debug.Assert(pParent != null); Debug.Assert(pByteStream != null); MFByteStreamCapabilities dwCaps = MFByteStreamCapabilities.None; const MFByteStreamCapabilities dwRequiredCaps = (MFByteStreamCapabilities.IsWritable | MFByteStreamCapabilities.IsSeekable); // Make sure the byte stream has the necessary caps bits. hr = pByteStream.GetCapabilities(out dwCaps); MFError.ThrowExceptionForHR(hr); if ((dwCaps & dwRequiredCaps) != dwRequiredCaps) { throw new COMException("stream doesn't have required caps", E_Fail); } // Move the file pointer to leave room for the RIFF headers. hr = pByteStream.SetCurrentPosition(Marshal.SizeOf(typeof(WAV_FILE_HEADER))); MFError.ThrowExceptionForHR(hr); // Create the event queue helper. hr = MFExternAlt.MFCreateEventQueue(out m_pEventQueue); MFError.ThrowExceptionForHR(hr); // Allocate a new work queue for async operations. hr = MFExtern.MFAllocateWorkQueue(out m_WorkQueueId); MFError.ThrowExceptionForHR(hr); m_pByteStream = pByteStream; m_pSink = pParent; }
//------------------------------------------------------------------- // Name: Shutdown // Description: Shuts down the stream sink. //------------------------------------------------------------------- public void Shutdown() { int hr; Debug.Assert(!m_IsShutdown); GC.SuppressFinalize(this); if (m_pEventQueue != null) { hr = m_pEventQueue.Shutdown(); MFError.ThrowExceptionForHR(hr); } hr = MFExtern.MFUnlockWorkQueue(m_WorkQueueId); MFError.ThrowExceptionForHR(hr); m_SampleQueue.Clear(); SafeRelease(m_pSink); SafeRelease(m_pEventQueue); SafeRelease(m_pByteStream); SafeRelease(m_pCurrentType); SafeRelease(m_pFinalizeResult); m_pSink = null; m_pEventQueue = null; m_pByteStream = null; m_pCurrentType = null; m_pFinalizeResult = null; m_IsShutdown = true; }
public void Dispose() { TRACE("CWavStream::Dispose"); SafeRelease(m_pEventQueue); SafeRelease(m_pByteStream); SafeRelease(m_pCurrentType); SafeRelease(m_pFinalizeResult); m_pEventQueue = null; m_pByteStream = null; m_pCurrentType = null; m_pFinalizeResult = null; //m_pSink.Dispose(); // break deadly embrace m_pSink = null; GC.SuppressFinalize(this); }
public static extern int MFCreateEventQueue( out IMFMediaEventQueueAlt ppMediaEventQueue );
public static extern void MFCreateEventQueue( out IMFMediaEventQueueAlt ppMediaEventQueue );
public void Dispose() { if (m_Riff != null) { m_Riff.Dispose(); m_Riff = null; } if (m_pEventQueue != null) { Marshal.ReleaseComObject(m_pEventQueue); m_pEventQueue = null; } if (m_pSource != null) { //m_pSource.Dispose(); Children don't dispose their parents... m_pSource = null; } if (m_pStreamDescriptor != null) { Marshal.ReleaseComObject(m_pStreamDescriptor); m_pStreamDescriptor = null; } if (m_Log != null) { m_Log.Dispose(); m_Log = null; } GC.SuppressFinalize(this); }
long m_rtCurrentPosition; // Current position in the stream, in 100-ns units #endregion Fields #region Constructors public WavStream(WavSource pSource, CWavRiffParser pRiff, IMFStreamDescriptor pSD) { int hr; m_pEventQueue = null; m_Log = new xLog("WavStream"); #if false m_nRefCount(0), m_IsShutdown(false), m_rtCurrentPosition(0), m_discontinuity(false), m_EOS(false) #endif m_pSource = pSource; m_pStreamDescriptor = pSD; m_Riff = pRiff; // Create the media event queue. hr = MFExternAlt.MFCreateEventQueue(out m_pEventQueue); MFError.ThrowExceptionForHR(hr); }