I'm relatively new at C#/.NET and having a problem with a utility I'm
writing to create some data from Windows Media files.
I set up a class that creates a WMReader object. Before I kickoff the
reader, I use the IWMReaderAdvanced interface to call
SetUserProvidedClock(true), indicating I want to use my own clock to
create time intervals. Once I start the Reader, it makes the callback
to OnStatus method properly, passing status of WMT_STARTED (I used the
yeti WMFSDK, but had to implement IWMReaderCallbackAdvanced myself as
it wasn't implemented in the library). However, I try to update the
clock value using the DeliverTime method, and it hangs there. I'm
thinking it may not be kosher to access the IWMReaderAdvanced interface
that was created in the main thread, by the thread created by the
Reader.
Here's an abbreviated snippet of the code I am using:
using System;
using System.Text;
using Yeti.WMFSdk
using Yeti.MMedia
using System.Runtime.InteropServices;
namespace SL
{
public class WMVCreateLog : IWMReaderCallback,
IWMReaderCallbackAdvanced
{
private IWMReaderAdvanced _WMReaderAdvanced;
private IWMHeaderInfo _WMHeader;
private IWMReader _WMReader;
private IWMProfile _WMProfile;
private WMHeaderInfo _WMHeaderInfo;
private ulong _ReaderTime;
private string _MediaFilepath;
private NamedEvent _event;
public void CreateReader()
{
try
{
_WMReader =
WMFSdk.CreateReader(WMT_RIGHTS.WMT_RIGHT_NO_DRM);
_WMReader.Open(_MediaFilepath, this, IntPtr.Zero);
WaitForCompletion();
_WMReaderAdvanced = (IWMReaderAdvanced)_WMReader;
_WMReaderAdvanced.SetUserProvidedClock(true);
_WMReader.Start((ulong)0, (ulong)0, (float)1.0,
IntPtr.Zero);
WaitForCompletion();
}
catch (Exception e)
{
}
}
public void OnStatus(WMT_STATUS Status,
IntPtr hr,
WMT_ATTR_DATATYPE dwType,
IntPtr pValue,
IntPtr pvContext)
{
switch (Status)
{
case WMT_STATUS.WMT_OPENED:
_event.Set();
break;
case WMT_STATUS.WMT_STARTED:
_ReaderTime = 10000000;
try
{
_WMReaderAdvanced.DeliverTime(_ReaderTime);
}
catch (Exception e)
{
Console.WriteLine("Failed in WMT_STARTED");
_event.Set();
}
break;
case WMT_STATUS.WMT_EOF:
_EOF = true;
_event.Set();
break;
}
}
}
}
Any help would be appreciated.
Patrick