From 430ef2c10e95354e2f05174aaf1f00b99afeb0ea Mon Sep 17 00:00:00 2001 From: Sascha-L Date: Tue, 15 Sep 2015 10:23:15 +0200 Subject: [PATCH] Bugfixes (Memory Leak), fallback mechanism to auto generate graph if manually generated graph doesn't work, fix video playback if no audio device is available, LAV Splitter Source is not hardcorded anymore, EVR is default Video Renderer --- EVR Presenter/EVRPresenter.vcxproj | 1 + EVR Presenter/Helpers.h | 2 + Source/DirectShow/Controls/MediaUriElement.cs | 2 +- Source/DirectShow/MediaPlayers/BaseClasses.cs | 155 +++++++------- .../DirectShow/MediaPlayers/DirectShowUtil.cs | 79 +++++++ .../DirectShow/MediaPlayers/MediaUriPlayer.cs | 199 ++++++++++++++---- Source/MediaFoundation/EvrPresenter.cs | 22 +- Source/Properties/AssemblyInfo.cs | 2 +- Test Application/App.xaml | 9 + Test Application/App.xaml.cs | 16 ++ Test Application/EVRPresenter32.dll | Bin 0 -> 39424 bytes Test Application/MainWindow.xaml | 21 ++ Test Application/MainWindow.xaml.cs | 41 ++++ Test Application/Properties/AssemblyInfo.cs | 55 +++++ .../Properties/Resources.Designer.cs | 71 +++++++ Test Application/Properties/Resources.resx | 117 ++++++++++ .../Properties/Settings.Designer.cs | 30 +++ Test Application/Properties/Settings.settings | 7 + Test Application/Test Application.csproj | 112 ++++++++++ WPF MediaKit.sln | 10 +- 20 files changed, 825 insertions(+), 126 deletions(-) create mode 100644 Test Application/App.xaml create mode 100644 Test Application/App.xaml.cs create mode 100644 Test Application/EVRPresenter32.dll create mode 100644 Test Application/MainWindow.xaml create mode 100644 Test Application/MainWindow.xaml.cs create mode 100644 Test Application/Properties/AssemblyInfo.cs create mode 100644 Test Application/Properties/Resources.Designer.cs create mode 100644 Test Application/Properties/Resources.resx create mode 100644 Test Application/Properties/Settings.Designer.cs create mode 100644 Test Application/Properties/Settings.settings create mode 100644 Test Application/Test Application.csproj diff --git a/EVR Presenter/EVRPresenter.vcxproj b/EVR Presenter/EVRPresenter.vcxproj index 383dafa..9563059 100644 --- a/EVR Presenter/EVRPresenter.vcxproj +++ b/EVR Presenter/EVRPresenter.vcxproj @@ -106,6 +106,7 @@ MachineX86 + true diff --git a/EVR Presenter/Helpers.h b/EVR Presenter/Helpers.h index 11ac896..9c62bcb 100644 --- a/EVR Presenter/Helpers.h +++ b/EVR Presenter/Helpers.h @@ -133,6 +133,7 @@ class ThreadSafeQueue ComPtrList m_list; }; +//#define FILE_LOGGING #if defined FILE_LOGGING @@ -176,6 +177,7 @@ static void LogGUID(const char *msg, REFGUID guid ) #else + #define LOG_MSG(msg) #define LOG_GUID(msg, guid) #define LOG_IF_FAILED(msg, hr) diff --git a/Source/DirectShow/Controls/MediaUriElement.cs b/Source/DirectShow/Controls/MediaUriElement.cs index 5ce8994..884477a 100644 --- a/Source/DirectShow/Controls/MediaUriElement.cs +++ b/Source/DirectShow/Controls/MediaUriElement.cs @@ -28,7 +28,7 @@ public MediaUriPlayer MediaUriPlayer public static readonly DependencyProperty VideoRendererProperty = DependencyProperty.Register("VideoRenderer", typeof(VideoRendererType), typeof(MediaUriElement), - new FrameworkPropertyMetadata(VideoRendererType.VideoMixingRenderer9, + new FrameworkPropertyMetadata(VideoRendererType.EnhancedVideoRenderer, new PropertyChangedCallback(OnVideoRendererChanged))); public VideoRendererType VideoRenderer diff --git a/Source/DirectShow/MediaPlayers/BaseClasses.cs b/Source/DirectShow/MediaPlayers/BaseClasses.cs index 6d5e8d9..da3a9ce 100644 --- a/Source/DirectShow/MediaPlayers/BaseClasses.cs +++ b/Source/DirectShow/MediaPlayers/BaseClasses.cs @@ -1,7 +1,6 @@ #region Includes using System; using System.Collections.Generic; -using System.ComponentModel; using System.Drawing; using System.Linq; using System.Runtime.CompilerServices; @@ -12,7 +11,7 @@ using WPFMediaKit.MediaFoundation; using WPFMediaKit.MediaFoundation.Interop; using WPFMediaKit.Threading; -using Size=System.Windows.Size; +using Size = System.Windows.Size; #endregion namespace WPFMediaKit.DirectShow.MediaPlayers @@ -305,7 +304,7 @@ private void GetMainWindowHwndHelper() if (m_window.Handle == IntPtr.Zero) { - lock(m_window) + lock (m_window) { m_window.CreateHandle(new CreateParams()); } @@ -495,7 +494,7 @@ protected virtual void Dispose(bool disposing) //if (m_disposed) // return; - if(!disposing) + if (!disposing) return; if (m_window != null) @@ -509,8 +508,8 @@ protected virtual void Dispose(bool disposing) m_timer.Dispose(); m_timer = null; - - if(CheckAccess()) + + if (CheckAccess()) { FreeResources(); Dispatcher.BeginInvokeShutdown(); @@ -637,7 +636,7 @@ private void RemoveWndProcHook() /// private void AddWndProcHook() { - // HwndHelper.AddHook(WndProcHook); + // HwndHelper.AddHook(WndProcHook); } /// @@ -771,14 +770,16 @@ protected void FreeCustomAllocator() if (m_customAllocator == null) return; - m_customAllocator.Dispose(); - m_customAllocator.NewAllocatorFrame -= CustomAllocatorNewAllocatorFrame; m_customAllocator.NewAllocatorSurface -= CustomAllocatorNewAllocatorSurface; - if(Marshal.IsComObject(m_customAllocator)) + m_customAllocator.Dispose(); + + + + if (Marshal.IsComObject(m_customAllocator)) Marshal.ReleaseComObject(m_customAllocator); - + m_customAllocator = null; } @@ -798,7 +799,7 @@ private void ResetLocalGraphResources() Marshal.ReleaseComObject(m_mediaControl); m_mediaControl = null; - if(m_mediaEvent != null) + if (m_mediaEvent != null) Marshal.ReleaseComObject(m_mediaEvent); m_mediaEvent = null; } @@ -859,7 +860,7 @@ private IBaseFilter CreateEnhancedVideoRenderer(IGraphBuilder graph, int streamC EvrPresenter presenter; IBaseFilter filter; - lock(m_videoRendererInitLock) + lock (m_videoRendererInitLock) { var evr = new EnhancedVideoRenderer(); filter = evr as IBaseFilter; @@ -883,7 +884,7 @@ private IBaseFilter CreateEnhancedVideoRenderer(IGraphBuilder graph, int streamC var presenterSettings = presenter.VideoPresenter as IEVRPresenterSettings; if (presenterSettings == null) throw new Exception("Could not QueryInterface for the IEVRPresenterSettings"); - + presenterSettings.SetBufferCount(3); /* Use our interop hWnd */ @@ -900,12 +901,12 @@ private IBaseFilter CreateEnhancedVideoRenderer(IGraphBuilder graph, int streamC DsError.ThrowExceptionForHR(hr); var filterConfig = filter as IEVRFilterConfig; - + if (filterConfig != null) filterConfig.SetNumberOfStreams(streamCount); } - - + + RegisterCustomAllocator(presenter); return filter; @@ -939,7 +940,7 @@ private IBaseFilter CreateVideoMixingRenderer9(IGraphBuilder graph, int streamCo if (vmrSurfAllocNotify == null) throw new Exception("Could not query the VMR surface allocator."); - + var allocator = new Vmr9Allocator(); /* We supply our custom allocator to the renderer */ @@ -951,7 +952,7 @@ private IBaseFilter CreateVideoMixingRenderer9(IGraphBuilder graph, int streamCo RegisterCustomAllocator(allocator); - hr = graph.AddFilter(vmr9, + hr = graph.AddFilter(vmr9, string.Format("Renderer: {0}", VideoRendererType.VideoMixingRenderer9)); DsError.ThrowExceptionForHR(hr); @@ -1104,7 +1105,7 @@ protected void InvokeNewAllocatorSurface(IntPtr pSurface) } #endregion - + #region Helper Methods /// /// Sets the natural pixel resolution the video in the graph @@ -1136,14 +1137,14 @@ protected static Size GetVideoSize(IBaseFilter renderer, PinDirection direction, if (pin == null) goto done; - + int hr = pin.ConnectionMediaType(mediaType); - + if (hr != 0) goto done; /* Check to see if its a video media type */ - if (mediaType.formatType != FormatType.VideoInfo2 && + if (mediaType.formatType != FormatType.VideoInfo2 && mediaType.formatType != FormatType.VideoInfo) { goto done; @@ -1159,8 +1160,8 @@ protected static Size GetVideoSize(IBaseFilter renderer, PinDirection direction, done: DsUtils.FreeAMMediaType(mediaType); - - if(pin != null) + + if (pin != null) Marshal.ReleaseComObject(pin); return size; } @@ -1210,69 +1211,69 @@ protected static void RemoveAllFilters(IGraphBuilder graphBuilder) { graphBuilder.RemoveFilter(filtersArray[i]); while (Marshal.ReleaseComObject(filtersArray[i]) > 0) - {} + { } } } - /// - /// Adds a filter to a DirectShow graph based on it's name and filter category - /// - /// The graph builder to add the filter to - /// The category the filter belongs to - /// The friendly name of the filter - /// Reference to the IBaseFilter that was added to the graph or returns null if unsuccessful - protected static IBaseFilter AddFilterByName(IGraphBuilder graphBuilder, Guid deviceCategory, string friendlyName) - { - var devices = DsDevice.GetDevicesOfCat(deviceCategory); - - var deviceList = (from d in devices - where d.Name == friendlyName - select d); - DsDevice device = null; - if (deviceList.Count() > 0) - device = deviceList.Take(1).Single(); - - foreach (var item in deviceList) - { + /// + /// Adds a filter to a DirectShow graph based on it's name and filter category + /// + /// The graph builder to add the filter to + /// The category the filter belongs to + /// The friendly name of the filter + /// Reference to the IBaseFilter that was added to the graph or returns null if unsuccessful + protected static IBaseFilter AddFilterByName(IGraphBuilder graphBuilder, Guid deviceCategory, string friendlyName) + { + var devices = DsDevice.GetDevicesOfCat(deviceCategory); + + var deviceList = (from d in devices + where d.Name == friendlyName + select d); + DsDevice device = null; + if (deviceList.Count() > 0) + device = deviceList.Take(1).Single(); + + foreach (var item in deviceList) + { if (item != device) item.Dispose(); - } + } - return AddFilterByDevice(graphBuilder, device); - } + return AddFilterByDevice(graphBuilder, device); + } - protected static IBaseFilter AddFilterByDevicePath(IGraphBuilder graphBuilder, Guid deviceCategory, string devicePath) - { - var devices = DsDevice.GetDevicesOfCat(deviceCategory); + protected static IBaseFilter AddFilterByDevicePath(IGraphBuilder graphBuilder, Guid deviceCategory, string devicePath) + { + var devices = DsDevice.GetDevicesOfCat(deviceCategory); - var deviceList = (from d in devices - where d.DevicePath == devicePath - select d); - DsDevice device = null; - if (deviceList.Count() > 0) - device = deviceList.Take(1).Single(); + var deviceList = (from d in devices + where d.DevicePath == devicePath + select d); + DsDevice device = null; + if (deviceList.Count() > 0) + device = deviceList.Take(1).Single(); - return AddFilterByDevice(graphBuilder, device); - } + return AddFilterByDevice(graphBuilder, device); + } - private static IBaseFilter AddFilterByDevice(IGraphBuilder graphBuilder, DsDevice device) - { - if (graphBuilder == null) - throw new ArgumentNullException("graphBuilder"); + private static IBaseFilter AddFilterByDevice(IGraphBuilder graphBuilder, DsDevice device) + { + if (graphBuilder == null) + throw new ArgumentNullException("graphBuilder"); - var filterGraph = graphBuilder as IFilterGraph2; + var filterGraph = graphBuilder as IFilterGraph2; - if (filterGraph == null) - return null; + if (filterGraph == null) + return null; - IBaseFilter filter = null; - if (device != null) - { - int hr = filterGraph.AddSourceFilterForMoniker(device.Mon, null, device.Name, out filter); - DsError.ThrowExceptionForHR(hr); - } - return filter; - } + IBaseFilter filter = null; + if (device != null) + { + int hr = filterGraph.AddSourceFilterForMoniker(device.Mon, null, device.Name, out filter); + DsError.ThrowExceptionForHR(hr); + } + return filter; + } /// /// Finds a pin that exists in a graph. @@ -1284,7 +1285,7 @@ private static IBaseFilter AddFilterByDevice(IGraphBuilder graphBuilder, DsDevic protected static IPin FindPinInGraphByMediaType(Guid majorOrMinorMediaType, PinDirection pinDirection, IGraphBuilder graph) { IEnumFilters enumFilters; - + /* Get the filter enum */ graph.EnumFilters(out enumFilters); @@ -1308,7 +1309,7 @@ protected static IPin FindPinInGraphByMediaType(Guid majorOrMinorMediaType, PinD pin.EnumMediaTypes(out mediaTypesEnum); var mediaTypesFetched = IntPtr.Zero; var mediaTypes = new AMMediaType[1]; - + /* Enumerate the media types on the pin */ while (mediaTypesEnum.Next(1, mediaTypes, mediaTypesFetched) == 0) { diff --git a/Source/DirectShow/MediaPlayers/DirectShowUtil.cs b/Source/DirectShow/MediaPlayers/DirectShowUtil.cs index 150f3f2..89ef12c 100644 --- a/Source/DirectShow/MediaPlayers/DirectShowUtil.cs +++ b/Source/DirectShow/MediaPlayers/DirectShowUtil.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Runtime.InteropServices; using DirectShowLib; @@ -122,5 +123,83 @@ public static bool DisconnectPin(IGraphBuilder graphBuilder, IPin pin) } return allDisconnected; } + + public static void RemoveFilters(IGraphBuilder graphBuilder) + { + RemoveFilters(graphBuilder, string.Empty); + } + public static void RemoveFilters(IGraphBuilder graphBuilder, string filterName) + { + if (graphBuilder == null) + { + return; + } + + int hr = 0; + IEnumFilters enumFilters = null; + ArrayList filtersArray = new ArrayList(); + + try + { + hr = graphBuilder.EnumFilters(out enumFilters); + DsError.ThrowExceptionForHR(hr); + + IBaseFilter[] filters = new IBaseFilter[1]; + IntPtr fetched = IntPtr.Zero; + + while (enumFilters.Next(filters.Length, filters, fetched) == 0) + { + filtersArray.Add(filters[0]); + } + + foreach (IBaseFilter filter in filtersArray) + { + FilterInfo info; + filter.QueryFilterInfo(out info); + Marshal.ReleaseComObject(info.pGraph); + + try + { + if (!String.IsNullOrEmpty(filterName)) + { + if (String.Equals(info.achName, filterName)) + { + DisconnectAllPins(graphBuilder, filter); + hr = graphBuilder.RemoveFilter(filter); + DsError.ThrowExceptionForHR(hr); + Marshal.ReleaseComObject(filter); + System.Diagnostics.Trace.WriteLine("Remove filter from graph: {0}", info.achName); + } + } + else + { + DisconnectAllPins(graphBuilder, filter); + hr = graphBuilder.RemoveFilter(filter); + DsError.ThrowExceptionForHR(hr); + int i = Marshal.ReleaseComObject(filter); + System.Diagnostics.Trace.WriteLine(string.Format("Remove filter from graph: {0} {1}", info.achName, i)); + } + } + catch (Exception error) + { + System.Diagnostics.Trace.TraceError("Remove of filter: {0}, failed with code (HR): {1}, explanation: {2}", info.achName, hr.ToString(), + error.Message); + } + } + } + catch (Exception) + { + return; + } + finally + { + if (enumFilters != null) + { + Marshal.ReleaseComObject(enumFilters); + } + } + } + + } } diff --git a/Source/DirectShow/MediaPlayers/MediaUriPlayer.cs b/Source/DirectShow/MediaPlayers/MediaUriPlayer.cs index 11343cd..4431db4 100644 --- a/Source/DirectShow/MediaPlayers/MediaUriPlayer.cs +++ b/Source/DirectShow/MediaPlayers/MediaUriPlayer.cs @@ -1,5 +1,6 @@ #region Usings using System; +using System.Diagnostics; using System.Runtime.InteropServices; using DirectShowLib; #endregion @@ -278,12 +279,9 @@ protected virtual void OpenSource() IBaseFilter sourceFilter; int hr; - //var file = System.IO.File.CreateText(@"M:\DirectShowLog.txt"); - //filterGraph.SetLogFile((file.BaseStream as System.IO.FileStream).SafeFileHandle.DangerousGetHandle()); - // Set LAV Splitter - LAVSplitterSource reader = new LAVSplitterSource(); + /* LAVSplitterSource reader = new LAVSplitterSource(); sourceFilter = reader as IBaseFilter; var objectWithSite = reader as IObjectWithSite; if (objectWithSite != null) @@ -291,9 +289,11 @@ protected virtual void OpenSource() objectWithSite.SetSite(this); } + hr = m_graph.AddFilter(sourceFilter, SplitterSource); - DsError.ThrowExceptionForHR(hr); + DsError.ThrowExceptionForHR(hr);*/ + sourceFilter = DirectShowUtil.AddFilterToGraph(m_graph, SplitterSource, Guid.Empty); IFileSourceFilter interfaceFile = (IFileSourceFilter)sourceFilter; hr = interfaceFile.Load(fileSource, null); @@ -328,41 +328,170 @@ protected virtual void OpenSource() DirectShowUtil.AddFilterToGraph(m_graph, VideoDecoder, Guid.Empty); - // Set Audio Codec - // Remove Pin - var audioPinFrom = DirectShowLib.DsFindPin.ByName(sourceFilter, "Audio"); - IPin audioPinTo; - if (audioPinFrom != null) + try { - hr = audioPinFrom.ConnectedTo(out audioPinTo); - if (hr >= 0 && audioPinTo != null) + // Set Audio Codec + // Remove Pin + var audioPinFrom = DirectShowLib.DsFindPin.ByName(sourceFilter, "Audio"); + IPin audioPinTo; + if (audioPinFrom != null) { - PinInfo pInfo; - audioPinTo.QueryPinInfo(out pInfo); - FilterInfo fInfo; - pInfo.filter.QueryFilterInfo(out fInfo); + hr = audioPinFrom.ConnectedTo(out audioPinTo); + if (hr >= 0 && audioPinTo != null) + { + PinInfo pInfo; + audioPinTo.QueryPinInfo(out pInfo); + FilterInfo fInfo; + pInfo.filter.QueryFilterInfo(out fInfo); + + DirectShowUtil.DisconnectAllPins(m_graph, pInfo.filter); + m_graph.RemoveFilter(pInfo.filter); + + DsUtils.FreePinInfo(pInfo); + Marshal.ReleaseComObject(fInfo.pGraph); + Marshal.ReleaseComObject(audioPinTo); + audioPinTo = null; + } + Marshal.ReleaseComObject(audioPinFrom); + audioPinFrom = null; + } - DirectShowUtil.DisconnectAllPins(m_graph, pInfo.filter); - m_graph.RemoveFilter(pInfo.filter); + DirectShowUtil.AddFilterToGraph(m_graph, AudioDecoder, Guid.Empty); - DsUtils.FreePinInfo(pInfo); - Marshal.ReleaseComObject(fInfo.pGraph); - Marshal.ReleaseComObject(audioPinTo); - audioPinTo = null; + + /* Add our prefered audio renderer */ + InsertAudioRenderer(AudioRenderer); + } + catch + { + // No Audio available + Trace.TraceError("No Audio Device found!"); + } + + IBaseFilter renderer = CreateVideoRenderer(VideoRenderer, m_graph, 2); + + /* We will want to enum all the pins on the source filter */ + IEnumPins pinEnum; + + hr = sourceFilter.EnumPins(out pinEnum); + DsError.ThrowExceptionForHR(hr); + + IntPtr fetched = IntPtr.Zero; + IPin[] pins = { null }; + + /* Counter for how many pins successfully rendered */ + int pinsRendered = 0; + + if (VideoRenderer == VideoRendererType.VideoMixingRenderer9) + { + var mixer = renderer as IVMRMixerControl9; + + if (mixer != null) + { + VMR9MixerPrefs dwPrefs; + mixer.GetMixingPrefs(out dwPrefs); + dwPrefs &= ~VMR9MixerPrefs.RenderTargetMask; + dwPrefs |= VMR9MixerPrefs.RenderTargetRGB; + //mixer.SetMixingPrefs(dwPrefs); } - Marshal.ReleaseComObject(audioPinFrom); - audioPinFrom = null; } - DirectShowUtil.AddFilterToGraph(m_graph, AudioDecoder, Guid.Empty); + /* Loop over each pin of the source filter */ + while (pinEnum.Next(pins.Length, pins, fetched) == 0) + { + if (filterGraph.RenderEx(pins[0], + AMRenderExFlags.RenderToExistingRenderers, + IntPtr.Zero) >= 0) + pinsRendered++; + + + Marshal.ReleaseComObject(pins[0]); + } + + + Marshal.ReleaseComObject(pinEnum); + Marshal.ReleaseComObject(sourceFilter); + + if (pinsRendered == 0) + throw new Exception("Could not render any streams from the source Uri"); + +#if DEBUG + /* Adds the GB to the ROT so we can view + * it in graphedit */ + m_dsRotEntry = new DsROTEntry(m_graph); +#endif + /* Configure the graph in the base class */ + SetupFilterGraph(m_graph); + + HasVideo = true; + + } + catch (Exception ex) + { + /* This exection will happen usually if the media does + * not exist or could not open due to not having the + * proper filters installed */ + + + // Fallback try auto graph: + var result = oldOpenSource(); + + if (!result) + { + FreeResources(); + + /* Fire our failed event */ + InvokeMediaFailed(new MediaFailedEventArgs(ex.Message, ex)); + } + } + + InvokeMediaOpened(); + } + + private bool oldOpenSource() + { + /* Make sure we clean up any remaining mess */ + FreeResources(); + if (m_sourceUri == null) + return false; - /* Add our prefered audio renderer */ - InsertAudioRenderer(AudioRenderer); + string fileSource = m_sourceUri.OriginalString; + + if (string.IsNullOrEmpty(fileSource)) + return false; + + try + { + /* Creates the GraphBuilder COM object */ + m_graph = new FilterGraphNoThread() as IGraphBuilder; + + if (m_graph == null) + throw new Exception("Could not create a graph"); + + try + { + /* Add our prefered audio renderer */ + InsertAudioRenderer(AudioRenderer); + } + catch + { + // No Audio device found + Trace.TraceError("No Audio Device found!"); + } IBaseFilter renderer = CreateVideoRenderer(VideoRenderer, m_graph, 2); + var filterGraph = m_graph as IFilterGraph2; + + if (filterGraph == null) + throw new Exception("Could not QueryInterface for the IFilterGraph2"); + + IBaseFilter sourceFilter; + /* Have DirectShow find the correct source filter for the Uri */ + int hr = filterGraph.AddSourceFilter(fileSource, fileSource, out sourceFilter); + DsError.ThrowExceptionForHR(hr); /* We will want to enum all the pins on the source filter */ IEnumPins pinEnum; @@ -389,14 +518,7 @@ protected virtual void OpenSource() //mixer.SetMixingPrefs(dwPrefs); } } - - /* Test using FFDShow Video Decoder Filter - var ffdshow = new FFDShow() as IBaseFilter; - - if (ffdshow != null) - m_graph.AddFilter(ffdshow, "ffdshow"); - */ - + /* Loop over each pin of the source filter */ while (pinEnum.Next(pins.Length, pins, fetched) == 0) @@ -406,11 +528,9 @@ protected virtual void OpenSource() IntPtr.Zero) >= 0) pinsRendered++; - Marshal.ReleaseComObject(pins[0]); } - Marshal.ReleaseComObject(pinEnum); Marshal.ReleaseComObject(sourceFilter); @@ -438,9 +558,13 @@ protected virtual void OpenSource() /* Fire our failed event */ InvokeMediaFailed(new MediaFailedEventArgs(ex.Message, ex)); + + return false; } InvokeMediaOpened(); + + return true; } /// @@ -481,6 +605,7 @@ protected override void FreeResources() if (m_graph != null) { + DirectShowUtil.RemoveFilters(m_graph); Marshal.ReleaseComObject(m_graph); m_graph = null; diff --git a/Source/MediaFoundation/EvrPresenter.cs b/Source/MediaFoundation/EvrPresenter.cs index 23ed011..785c0a1 100644 --- a/Source/MediaFoundation/EvrPresenter.cs +++ b/Source/MediaFoundation/EvrPresenter.cs @@ -64,8 +64,9 @@ internal interface IEVRPresenterSettings [ComVisible(true)] public class EvrPresenter : ICustomAllocator, IEVRPresenterCallback { - private IntPtr m_lastSurface; private const int PRESENTER_BUFFER_COUNT = 5; + private IntPtr m_lastSurface; + private IMFVideoPresenter m_VideoPresenter; private EvrPresenter() { @@ -120,7 +121,11 @@ private static int ProcessBits /// /// The custom EVR video presenter COM object /// - public IMFVideoPresenter VideoPresenter { get; private set; } + public IMFVideoPresenter VideoPresenter + { + get { return m_VideoPresenter; } + private set { m_VideoPresenter = value; } + } #region ICustomAllocator Members /// @@ -138,17 +143,18 @@ private static int ProcessBits public void Dispose() { - GC.SuppressFinalize(this); Dispose(true); + GC.SuppressFinalize(this); } protected void Dispose(bool disp) { - if (VideoPresenter != null) - { - Marshal.FinalReleaseComObject(VideoPresenter); - VideoPresenter = null; - } + var settings = m_VideoPresenter as IEVRPresenterSettings; + + if (settings != null) + settings.RegisterCallback(null); + + COMUtil.TryFinalRelease(ref m_VideoPresenter); } #endregion diff --git a/Source/Properties/AssemblyInfo.cs b/Source/Properties/AssemblyInfo.cs index f0477ae..232cb14 100644 --- a/Source/Properties/AssemblyInfo.cs +++ b/Source/Properties/AssemblyInfo.cs @@ -25,4 +25,4 @@ -[assembly: AssemblyVersion("2.0.0")] +[assembly: AssemblyVersion("2.1.0")] diff --git a/Test Application/App.xaml b/Test Application/App.xaml new file mode 100644 index 0000000..b0bf271 --- /dev/null +++ b/Test Application/App.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/Test Application/App.xaml.cs b/Test Application/App.xaml.cs new file mode 100644 index 0000000..04bee97 --- /dev/null +++ b/Test Application/App.xaml.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Windows; + +namespace Test_Application +{ + /// + /// Interaktionslogik für "App.xaml" + /// + public partial class App : Application + { + } +} diff --git a/Test Application/EVRPresenter32.dll b/Test Application/EVRPresenter32.dll new file mode 100644 index 0000000000000000000000000000000000000000..9d952976cc0c389d98694938b8ff3139f28b2c9b GIT binary patch literal 39424 zcmeIbeSB2awLg54Ovng>Giai*#5!syCAEA`828ylNE`ukk^7H^||MWa4%ez|^SQ=Mz} zJKR4_4Po8Gagij8#=gprygXg+U$t-`}CgUgj zSUl~MSMc1s{=Yu?n8jzY^gqVj{K?M{|6`1v#h;rsojv!ie?ZE=jXld&EOS%cSL><6 z&T&N%(VW}>A@sjtfYf&mG~m>@9>b;h**I>lBKp6)vzEaJrhWHRa(W3U&_})|jo9{DK>p$Fkf6eLYHNuyr0P69bP`7{NDM6`M zcO#w88&dgm)g4rQFsgSGrwisX?ngr+Lf&{jD&&nV59#DA1p~Y$-4S99EO&#h+gD6o6 z@2uk2#n*FH^_)AK({lCfU&yNo66;Wk6MoSLcn=R2NDM#i^vi9u37bh_zqZFrfy0TYOym%E_9^ z96EzAYZD_AqYshf_-PjRb%n%OxPL6!qYVQZI~TvH<|H^V5*}}AhF9ah2x_A9unzT_^@--?)k=XW2+HE8y7%CCSQ67rR0~S;)5qSM1?JJiyy-Vao zE0zXW+Z+-!Mz2l2 zUp&m8tXX1wXQ7ZhA6@*LG?Z)rXucJzeQ$-F{67OZG~o;--kaM`d2R|u5dU}3v_Puv z?oy$%1e5ZFiWnn2Az68iu@fcKo4!O#H>`^8sG=Trw&j-->#76xSO>;9@Ly0;dF88Ze^T%tJV9FRfUw;V2DWzr!e;g@<8f`S5S?-^rY&vVd zu`@lIny7uElQAgTBl1&yg!`<-QC(j#$}pxvKIUJ9SBq)qczO>?hT?2!5aZMlwiB5X zcXuq2`2aAvcN4l4Dk3arwAP_U;M+8?XcT|ePiOqaz!}q_r^fMF?kF2(BE@wQ8!)~K z#i@y9iieGz#&?8u#fm{gef1&tyDK?e-9GRe=h!rm2)+%^jzMRYBVfN+_cUel7l{1% zi4Olu-KZ%z;UGE_%%`P~3+B^`g-3$;&`04JiYr9L?gU^Aw4bFS`Buu-R&@sRZ4|0U zi98Af^9$+W2-=6~`MGvOzD6*kslF4MAS*k9#Sx0D2Hy5gkHzh*%Xh~xY*ph03FKhF`!S2=`Pa?%w3UEx(w*B{eAAs90e74awe;)`{D2qlhN01hc0 z1c~kiJop-18A=MpIZ&4)2f>At z`G`^oeW~YsiA|YiqXzLMdCD|KD89t1Ok?zQ;P zacVz6gcQuQOLldH=NhMQ$30h0%P{|n@K;AEBRPNf_((*02~A;o`3BUO)>qQ(OaHpT z!0JS&-#ZYBD+0+OpC!@-iM2Ssz!qAqcJS)Z_ek^Phc<;g>Q&n|m_7PUA(9xL%uOLT zQarj%p=Lb2bAnL-A<4g5OzaA;|PzbPc5AmRfBUGA*=_(4@cjlp`j2TfU>f1EnQO?j|ROs7a z<+PihLb7i|9zx$ksNCr`;1Os)P4lk(1n%f2CY(d~GcdAg)g>ij(S|UpH}ivm_U%X` zpd(amfttZl8gOCx+ZhfW42Sk3L_-p6--QrW;(zG?Lc#V9+;uFcQ_8`d{Z4%(m{pAm z0|9DPsUx)7DqIhaB>hPP^=sR&P=<)~1ht)iiJ+ii@MoTdDf zP??^kCG!P&q1CF;OAN6Zuo{;Bt-xv<=EpUtIY3!hy!_X)NvskRFvBK@lbV*A8j`s0 z2$Lb$XeuJs@p9^9h~OIG%K|a&v@`IaioX`+G?FkN`+#!_TL6IRN#pGs(2Wl@UbzyK z14DhApAe`V{9M}$=z0_$JUK1k1?eL#F*Y``_%)6!I*U+4?Ug3`b4tb#l- z1PEo>zql*pPzCKLPD8NqQGw!~QnwzREI(-VoeC64@847 z0a*QyFdT!B1n%9`F&eD~%4%y3K*1261A7oMVLuBDIE1GVKp!!2Y<~MWORiqKeLjRa zHMqQx8jNW}Dn6PWZg4Zhcq?Gss1LI})LKYYeQ!HePqjt!i@W-(aO3S~c{S*-71p;Hgd94)$9M@v z#;O)8^zrol^TA*_Mf+^R2#(Pai z6kutI=X3P_NU|ZwC=};|TR9&Vg{Au-nxa_NKcvxaP4wFjz<%)C51~T8y@R*MI{o&; zLHiM+li#~r;^}*2hHgLQo%lw3*5uAUEpb~!pt7?JdVoRXfUk(S>v}LYeC4@%&c99w ztUCg=x2HZb)EXbO_Y&5!p#3~O{gnf}x(Wlg6A`ie&nc8^3we*ogSs)C$7H7cNT9OU zt=k4HfyzC+x(qC4VuRkqFCLh=_`LS{#d~=BUcdbyEDkfowBNoT_Fl{zWQ6uFDGzxM zI)vT1sHXS;*p9dN_;XY=&2rSdeSa`V6T#`ZU=GQB&c7g*FFxdt;O!m$cpg-tL@sD! z>IZK>f&rY&m>g?6qu15AfvIK3=b}=qgrn_QGR<=|{zyJY=bx*R2U58{$A(7`#-7^A zdo?g^V;KWL;UgKnLd1NWBqm6sqfr?sbL${cN=a@Ggd8&;`3J!#QF%i1k#cN3K+?k5$KLaz%~D!v({2qCUP-LsR6#qh}#8-q3)) ze57T9_YQJWoK*S#0Vf5259yIN5`(Jw+&m_nRM0Lu7m|sBdGi`XHVd=%!w_al3>is& z?~uQ87^PiAlc6$aX=vwOs)H=w_<()b;XaRg-Fvsdn(+<^AKEBy)7O&b_4NwUz|@<* zCf&>%3C*a$#>CNTNF0(%!{A=(edudxQmf~_EdQo%HSmMqq( zl9<%kIcgOQ>uBM@L4fpcXQ84CqM1WWJNwc2+10+G$PL#pGnb^0KSv+t;{Qp1fRKMr z>X5%cEp&Ymf;m1kt~NWi(WtMKKUNM2Hq1Ax1Jx?a=bpqWzJ#Q`L~(w-$|c{@~9f3?~_HE3hgendwGKAHkosw$ELNbKJmBl33K@w&haD7OzPV}2nF&W#Ac z;5^74nlARxonw#Ki|i4fx0yf^>exfy#vX~g*kgtRApTXeg82qREU|cBmW46`muUaJ$}|a%wlyg zhOHIRzHDyY&HN5(HTWlnC#?xuTeutj6Z~5ap^IaUaM{|C*JELXKdxpke&}C35R9TR z3D`fEM!_N61;+}Xs}4M@3P$OXX9;?){B9btf3NN@Aa?)1VENqp*%HF*uOZ=9z&ONnO_dNWK?LEhXL_St z0h4zZggEp;ZqJA5|GqsWu5BtF=81Z7s8%Io5}&|_d};r}49BUwf8lFLRH^#@2!c^a z-S;~wr0Y8+g<|{OkV5f&FG-<c-6w>qs5E|70s-IMS@5JKr(oPTjIX+ftY%}Y;a)HUEaeqC3`qCU3dz?&d;?ACNF|+g4{vvLPV>(KG)8AUxNDQSSS$!%sq>@ z4?)OHi+aoQ-iBLHsyS=)T3>{jov&X*2*6t(zXOSpAE8 zV1XB(FLm3XLONlPLVJXIEby>JV>-|mj_-m!8nB;(L2=$+3`5j@8fGWuAb1FhJ_`yD z!?ObKHgrUod1(FyJi4HPioT&2(trrk5|)yJUo?=xvVEiGf*fHYjRH`7j;%15V?zQ| zbaCyJO#EvM~d`zIw=nR!tmAWrNd38$bg~ZDtM*_ci$agB#-pNnU7Je8g zR>QdftH7;-NXB61QR(4Qw;6op6ixRw1C$`9SI6=b%0;XpM+LL1;zVQlHhw~>i~%;i zm?$fnvIR|=wybACxQrHl=n?CW4x@nCvs`<K@FT%c9D+{+qo^~6_?H=vT!N~M zji6)v4W&@~j}6^Yf4ehOrs0F|p|j;1qbvqQ#+2@?{Rt!TK(>8o`>hI&nn1Bo%1625 z+u_P#(_iu!NmMSv6e7!vQCh>Oo9+x054_fa0^&w(geB5@3zi8oe`tf2x1WzD4aZR~ zym32|8U4|3kP8c@pP-;NIuop+O|8XH2g5B#d&SK`&>U(kwrC4AGYeHS;d6pf9vg)B z1v5$90`WW5epm`68cPg7?@?Lit331YqH0Wrly#N zkKyO5kUa&S&{Y~S2^(y1TQI0q3`$Lgj?$AM5)|#j{=>o%eFFN?l{*l$MJ&18ym4$2 zj9p;eZ6J~Gu8~bFzkNWO5s-k|K=EKHG`+Hmn4p8u^)5*ZH6~OX+n64U%eQWjTYD|` zVEGB?A|{9*96AB>1_E$!Ebu7qkobGn2!DY1;B?Ui#DB;nrr;pPI4dy*V-leXDg;@i z+HFnf2f65CszN(AVr<0J1xN+!klT()WM*Gii+P#I3&73wwxdcY#+IX)I$bIe?QVty zXZ%(n=1i7yBHbIui3A zrtY-O9m(k)oik%3r*m`;JRkz5RVkbaq|aY5kEGq<*d%mKxj130!LOxktDV1q0~h{v z!{dpic%CV!V7_b19l{T=H;0uTD@!Bx$b4T$t<{BA74rFc&>89M#8AJJ&#wlss?eWb zoxZ+$b-wS*2pj?!4U~k90POzVL-ZyW=dI*5h7ean7&0_Sn+zfD&tC*Vid7e8|7dAE zX6uJ>F7=1JCDME$e+d65**n5@e-l}$?LO?zM0lY>=(diLzYkBOiRp#Usz15|WjHvA z)q(kK!WOKgY;?ZkTQ?lxP2nG9GWV2cCR>-edI(*IMs|I`^DgI4qI_q4)aY!*9K*^% zR_Yen%oHA&fvOlSNxCamX0Z_ZN5d5;)LzU1Y%P9TsJU++lpTOr>{W1KBk#Z9F zE)d4pN%9a*p5TNzEEw8#73fyjtP*W1%Hk7aZX!E9H04usVce zKn;^4R#wGi{s7T5?I8(O4OPx2fJnPQ?jl%7MOYt(7X$1UZ$_J+TpjyO73kUvd(vGNca~9fsRCcxL6IAx2wG|+N$V{U<8~> z`dm9DCfo(|K*ymzQ3ru^gD=``09U~wP3rQs;15he|3vuv{CBG$NuV_{c#Mo^vZ&U= zl}r-{o=sY+Fw_p-Ps1Vn6{A7DlMnt#U8M5l|M$f6W%R%nk*3T)g`XHIWv*j2$Ck%1 zi-_$5?&|=E@t=fKRsIN(Y@;E={N@`Vf2_1jZrA{g>BDrd+FQ&&&g|who?O}!zF5lo z3b!Wpbpnr#-*p#xABhg$2Ksw$ZolNY2^Gg-&mj~?8U&d$%!HX@AO4VBZX<5C@BpH{ zs2>uE&dCfr$kQWwHZjpiRlG=}kAsRjUdx}T8Z{s91F^%oH?IrR`ppVg9 z-1K#cGbwp>ktfr4a=`a>)arXfi7%;LX;I=*<6^?AYd6r6!)O2u%PawwB z<(*Ha!M%rTEiMX&iGu*>!{+-Lak8=b-rattEr$)ScM4-9?`>>oF_|?SzlD@X>|ij5 z8QbX~R-3}_AQu@{z#Zf?^B1c4HyOOLGK4!KU~wpzP^=&4yGBHdj-%0XV*2opRsa_X zD=e#6@YYP`=U)sIT%oP20hGBcZoMCAs+dY%Zc<`)lx`AM%t>=t9EfAJ8R#)JOii+(RLB!aYe z3u&?;hJRD!dZqnH8ZYnFNn&;iNISVk96wS%G)&qCa*Jd!D@po?nWXoVly9rWbi1AR z(VFNl(D1$)6o}z{29}`aeY03Vg&CR3^NSFHB$y@chcLedmRp*|H<7q1!QrwY$s!P! zN>~J9{Y*C7H48-(iAg5VAFBZlJxKh3MNZ8ThgJpF7vXRltqeS~+p0+NM2XTtV>BsM=MksKU?#KsE zqL=XOig^+d!lfwAa-dXcN&^flT0p6#?k=o0?m;X8V3uf{bJdXQr75j)_fW@2K@X@3tjE`6menJ&^Rwb_GvHZ1fL}6k(L#1l6co_r^0q^(@=+=c}At2aH z|AXovqe?J`Y3zJ~%0FM_SNqc;MMAk`O3OuojvVHr(20UXlowFEzNGd@d`&!p+VoT# zPWY;@j?Kike1qBd!JkQ2CnMuhTLTV_;G_ia zXG<{zv4&~lm4x!FD7=7D&k}8vI6xw>lu1T9lb}c<@i!)k1SKU&eT2Y}&(eMj=S0}; zAP&Are{4YO>^iojLw~Xl2MVfXSthBB8%QT3m9Y|QM_~StunNvJl&aKe?|l<`*m7+} zbTi0}B#PYIshx9t)lFEGk9LF3+Bt7(XS}`YT5Z*2Qq%gQ0fuJTW3kMsP@`I`kS2<3 zag3}Wj6d`cSlCkctP_1&t4K2T!f7O+3i2C~;vvwjmwBt`HUw(}5|b?ngQZTuh zbIef!8|BWn+aOJ&iU(nsL3y#*2R2Mu8*M2TS|@hU++qv9=xI96<|<1FQ;+d4bw>k- z?J+2R%l-CicZc<;MQ{Z#m|VvwGwT?^=>VXC!t9Tv0%2(WO{RB^fgQ6?QtQeYN0C`V>2;H9Zqvk1pGl!nCy*|3NS7MRJtMZP?! z5MZLB{NE{mb71~3P!RnE&2{3uZiC%AEW8VM*mzh+287{f%iEH0`$Cc~M(rcPT?lGy zA+1VVbxJ#%#>F1X+?BT=MuCTK2$T#9Nzm~5d|RNz23}%7ARsG8PjbjhO_9VbV_MWN zD#rzjV7%Z}hjA%X!xxy#u~>Q%uuyt#RP;Atiqv0Af0A!qY)GPm_nJ-X;<0zK!80{5 z-xJ(Qngjg=%}szWum$E*BZ)-M;-#mBfR|>rK9s}y8 z#cgzjPsJ-Lq;sJjHZm$96dG@2P#^3CFp}uR7@|h=&B(YUh z9;jK0*3nq7k}w3xFVDPga4gXK1kAHwd6ZN$?^KizJUWQlgoHS>hH%6H;e4!oQYRO- zUs@A4u3JPrJref2i#=wZo^aYQFvH%zh*f;dDUuo;8s$uslUQ&@QaOu9WQjCQO{xD^vX=i$sM=YQ99^7majE-PWK&LHeC1O zdI;ApTphT6k4qjqdNTeuL*=^=v@=#1v6#cF)}U{_HG=;!&1trXd2WQdetr6nsY@Q{ zh}121QowiAO<~d-X@h~Kk&jW@AKM8pRc6-RlRG_c)1DkA3eU8_mL8OJ1hxqD z0DlXQVSMQD^%hx{^iQMYndDYv+xnuK$&RYA#a7y(VG{^jI_OBC5)0f0JFKbG{1$2& zPJ;&RU8q6cs-!bmaJST9JIa0*tIT8`hGrQyboBGKh)Qa z%uONUTRL1{OV4SWLM`;X7CzP><{_YdN%e#ex%812yPiXKJbKm_KrFn?WCcOZveqzI zRt`%8ud58sBscTLsrCUwC2CF6*{sJDlsL^cf5?KvTlyv2nm_mWc0FbVS0iQR)NY`%mrzI6H-P zOHg4&BW*!EfN)MaI-u@5BZYK*T~a8v@2C`t?>j7o68e5Ah4g)UrBGtulTt|2w;iD| z^Aqxa#DAO6Bl>T}+W#~Ln$2g(W5sz2wGx|{k0YSIcSC_3I!=MN(b{dwNY{5n3dQ!lD23wt4oIPdz8^~=ecvuAl-T!(6w>r4beHtK^aqJ7iuHhA2&5G=STKt$zQBBUaBCuQDt^K)LRer5 z%r{{w)gyCI*oOs1^e~~rvf;ipZ03WkC*vyoS1Z8vMH|f8`$0< zIbSA-yNIZc;h>Qf>jPE8^)b5^Z+(U9V+lOfSEa1)A+?ZA^_7g&7wI?Gz?c}(rls{k zk5dSERRO~na^ghn;vsliK}ARbAu#yyk0oU@G>4P50FLg{{=#fUSU}%3U}Un z5ihn#IBYB@&nfhi^m_{%r=Y68xEH3=+SwbTVMwi-4zJe)+9$=n?AKxHg7oLH|I6EZ z{dS>03P?lt!A)PiiuDW)uN=n7h`#CQFrFxnqoHpLg~T|WZSi7X*qg;{>k%&`2v{({ ze*D`Y6D=1)0$@c+J6hWc*RNKz$}WuY_ObC`{+X)4k|K%!jk5hf9zC)jruvTRQ4J(^ zpkyGpg{q{epc{g6A!> z#?FG2$_Gf;+Z=6E#W#yFADnp4Bb3A^hniI(1NL=wID4QxQ5&q0%|_tIe*RA7e!d9? zowOm2lR@&Um|wz(f=g%_|0pSxn75LH&i@L}j3&`B@% zX!F?nS~j$YYyNJ$I%t|gZrw|P-jy1jQI^Vi;oJT``DbEDT?2mTGf}XSu{06r6 z#qktHphRjMaK*XF2)w$~DHLJZ#ep!KsiUKm0MMhX<(MZSus;!f0Q!Fot6m!hV%FM*lv}{?26`6=Y8x+vvTPKY{Jvk*!|u z%{Y-EL-5x!U!DX&ULN!VyhBn{n2hPi<4rlm8@Z!5xyGM=IDIHjJ;^f%2aCEM`ih2E zyL-t>4VB`&0}`1{NgrAeXPme{Gcv`2Uvy@9wdr1+w}j1dtOy#MtI$orA(TH0hU>4RT1h8SMm(y;LQi7b@}ZV1NI@fL6}`A z%snnv+g42Gpf?^vES{%hPAcY>8g-E4A~ZbVH}tM3tx55|bs)lY(TahzzF8z=zc!pQ zi5AW%@vRpW`1bf6)3(pWJn5f^TpVMI#u9{4nIQH)Y_yDCuS&u7qIXC1YrwmMV=wV+ zQe4M;CsVK@2MT7u6l5>K!r?v27?Qodq~Jl*f^HR@u!|LEuM`CG^+C`LtYafRl=J5& z`f;KkTQ4jzKY^A9ylWxGO!OErd%!PP?_M8S@2-9xo~jI#BuLAQ@E5Qqz1%_9jb*dNC?cA>4LT087vTqUBHMfRx@U47f(|#eG2vccizXR zUWH%Ar;bSj;f;Bnj;8c4^lg~MAwmw0{t}9?Mh((Jp}8KR1OuG z!l%jXgUk^@uf9T7vhwm6jo3v_q|?m_5Wo+Y@-#h%E@LR$si4D=mKP`uAez01Of67b3! zUhwKvS-Q0L3*)^a3vAd&Q1|~rq|rnkr!Q>=h&!sAOnUf4uOtcfh8;Ba-#`+P9)%>v$6h~KLsBuR3#?WfL$Y6=DIoDbMG-h$Q^8U(Rwq8( z;-f))G>Z=pJ!+Ux66w{Zpx2eBX?c1bEl`4&ahX6Bs-ae*YZWvcBbtl26D8vN^*7@S zP9O^LB_;_g)(F``65mhrom7XbCFT(R{MOa09V1Wvs;qxJV*(%B5Qm7LKTZS0kqE3F z(}1NT4G_g+mGF0L0Fihc{mBf)wkGJo&TCv?UOJq~#CM7!v227^SwnFgR1`kH&~G1t z(%|lf&WzU(u?Ayd!rRYrZ6L6;*Egnrx{>!ieFL+`GnX)Ay~b04^*Et@p1F7jXw0j~ zpW8#XZn|}i2!jnXWcjAuTmo|YkPw(3@4W_wEE8o@!lI1rnZwk@hBs4U#fj-#Cve*K zTdC-J6F$lDKB~h!hTn4Juss_Ic}RyF_D%;N5;_OseK z`PHjpE`R9j#w#``xZQ_>8*tE|Wt}CzVQm|1`V#l52WOVJ>$$1<4Q}0Z*g~a(1_J_3 zCBGWGzPxu3;_f`X`XcWLv(4azr#{y%fv0%ZF&O^Rl2R3q-eSKIeIjOaI78Qs?jP^% z?Vo~H@+D?$)R#d{VL2kFEyNeR4I_>u5@(_mN2_;igx1=BEl@GJF3GUs^Z1fi`zdW+ z7eu8WhcOk?NPe9_8gX$xedGFweoC?|v^s$=pw2*UNmDC?vqH#a;&aT`f7qJ~Vdg>r z^_7wjc)gj!_IADvOVg?{gDKl8l!eY}waga)wsth2rYa z<9fJc2bl_sZ#=~!Co>WR@O}&5rr_Um2+J`M_`we1oOXD*2DF7e^np0~2aJwT93cZc zY(5MK-rju|)#zDV=*cV8wi9DR)+qFw{CH8?5K}BS56hp+-s~n~NlBNFqI-v@Nl0V<=cQ&x`R&F3Nd~_TL z`>b#qbl`hC8*4=Q3ejDT6S_Dwhsh_uLj*_vd{a2Cf|ENgfu!us4K#{uM8Ipm^B3fS zvvZUQg-9@rO}K>)mBLVQ4=xdlhvJ%n2nY7&+rWf3OCP7Zc_}4gTXubJ_!D*gX1EgS zL(HnW$RxVI81JN$Q0Eyu>eGf++t8TRwxiUq{t2Lszrc!e$eZX0{VrILM+3&rKZ~7~ zDN#r*Wju?I35hF-`y!}I2;Lm^(}ObbEgwG}nr1*S zG;IdEZ>Lhzwz2z0c8_KEA$IS?yvvJZg8s=q*8tb?)P4AZ z7zClv34r64$@J|(Z{+94`_kY|!H{D4jD(c&OsjIgxB^zr`r%Moy~ZhA59!U8)|e{c zF>u}jh=cxE;Z!);DLl-QrBCRErggD4oo4rLc0Y@|%#Ei{S2@dZ?kq1cc2eiM*aE&H zQFpoL@_+bxI6u<-h$1gR&Wj((OF&-yq)vRYvM4d0${WvIzQFe&q{H)f{W%CzPDNrY zrM=(({)g{>`hL%(kGvO=KX|z=F@f(wPWXsM_U{^(y7|-x0=X+x= z|HtJX-+yomm(<{#s}rL}V{{(vU%(GS!7?NC^tqRD>%k39wrFFgZOL)pcR1mo8WJnm zfFZa5tpV@GT%_>d5MDsCr6gmhZeKj= zg>1)xn|_t$P0zJhkKP*8zAy>ilfnKNX+`v9o<*5R&*b`B1Up7?LEm?Y-BPH1p}0ge zm1GZEsol&R`6<+9DWk{l)%X{yeL(-GmPP3n&lk|nR33xgOTaUT=l0;;90b#j%} z>)eL#1LX-!DR2{w*?F?}hH=o-pQ*zTq}RO9jFa?e z2wrv*8`8}X(4fBnI4Md6FJzURtx))BZsq4T(0RF zDKXTIeG)Vx%6pHD>_&iH?wQ(oJN3b1l1t2#@~`0jw35QO(IXj+EiW`H&8Bc47%1N#~qCbiIkr!SL|&^|A|wk7OE z$^!Q_Dy~!5N5REZ7~iVIo@V`x3?9P}T_3sNojaaBa2TUDc|YCb_R{_4J#LR@J0l7nf6iU(}xiYMjybP8XSy1$Z{c;i<@m`eVnD>*Rxp~tzJ`ZG3H2IxH8HIg^T6jik1v*K;0IWz(>@=BH$DpE&z7M1 z{&l)G%}flentwM`8QcFEI2^jUJjAi6SkM6nq%BGl7C=IG@AOW>%Q{u%PJyQB@%mVI z8&$U##HOV!RIF>ufYvz^k_LNcK>T-6=|@?{TG%|?WM0;~vez?7+BkwCb6ofg<-u!m z^-m&-nnTliNT^La$L@!4A6c!K{tczccm@o`7h0pbw6EmEYF}9}!Pgldbqrqun~HhL zH)||kw_L*)s-xbueAzN_uCH^3<##QD_|jPTRRM+;TvPwGdpEk{UNG{}Q>bXNQk-NT zGX56(Y=hz_PyMXDpaPT&4m4PcI}BVfTLs#67o|DGoHDRB+tTr5@V3Nb!Y!A(eZ4qt z!=@ALqLFWmG6fM7<2mE0O=fU&r*_vd{us?e37jmTu?0k`p#7-#)#7_`7Aalrp?8*! zGr|}K0Z-MyOE$W^{Py)<6C3z@!567rlU3TMll^{RS(DDD7gyx?j}YJGe)TT*G+ z#K3pZ!2cWweXeuT>L#y3w5L1-$;bro9>Ur0s#gowl2Bo6BCdrW08U)6LJ0N-?7g7w zdF)}U`4n2-LLWGUkEsHDN^Ho#?i_uk?gO^WL0VG+Q=@8?h(Y0wLp zAc4>5Way}pX(ypJ|uq8)>-vN$;Y^8{h&eIVZ$9i>>y6|mT;J^I7pUq}w&K<{Lo*9qhFc01OaUKBt6p4>@pHx{c zw_JcH3i$@gr`ve>&`<@mAvA3OcXt=b&I91Z1;<6M7KJe>V*Z9iT>#h2-Vp{L27`mI z>06_AS>8jL2=hE7{0Q^O5}sr=`>eP);_m%WY2DN@fds$rMEv68p=oac-2eQJE&N-ll+G@4F@D;0(Bz6khj1m8gLJqV4!2Z~Sk#RC}IqkY}VLY*j7PK8cW zp{M0Sf#ThL!p}!qcK0s8%|x!)tXrwXZYuGhSc0|3)@Oee5Y)7`zEAsEaMQ6t(5-Ly zW5npoj=%mK>iu!K!*>q??O7ysxOV|rqFg=tH_+Gi3d%^7xmy6>vjjLqwSI-rNaqle z>i;baMXCP!QT4B-`ej^1s2akxpDKNxa6wEtgc}hW(>61KB@);+0t^4Jm)lqPGSRcM zuN%)W?jyh*MTL5(P`O-)HA>a@vu6~b)Qp~g0(9FG0G%O&vO4g(MW0&<%=%Bj1_J&H zp>SI$fY(6!%u4w4K>jens|fz>E8z$G)JpgPz~4jgiwORyvG8brpYXFWjh{;JYo7%C z1LMH^j;Z^epi?<0`rO!}y?E29;|Nt{U_}{y)O{`qew`AYc;pblAEK%_22cGh1Q5PG z(`QoxcLCT(z=MSRcL+)J9PEo%!V%Ji1m_^6&&qHzQSmW|K4CxM7y5ef43972zn#h@ zQn^-y!dWy#YRXb$G3l#D2%P`_(C@V$;ZHx{`V+2$xahZ*PM+eIuopL6=YGO*1GrKV zF2Z#muG5JB32>j`nz)DK^ti0JDsVO6+Kg)#t{>w%h^qtFySV;@>oZ)DQeAaYT_!yB zQusyS-hpc~u7CZQ<5uD6#B=UFmN@zVj<*AkqVBHrIx z#_6U!00lzvlmB)MDXuGU(YseW8$|#)PlG7wm&3>#M&6#`nB5O={A2wHhydHl>0MG6z zoKA&T1sI@ogG#`Do#G>ZF0gx;{)W@(2rox$HCM~(T7(ufAl%AoZRIFl1gLpj9>UX* z*UGTWLyM?&P24i%Qp;AcyOB#~`4zxVZLj6(K$Ax9ey$j>bx3Jo`R^~>_S`?#-JSE& zq2HZZ_CeoD?h%|%zm?M&ZbU!yoUS>Z(-k3YDdLB|h4boCxEo>ZpWfR0`w16|_60wG z=MU3<>CJflE6t^!{BZ6Me*M!m^+O#`o%X$cNPA&+$uDQ#@#&Js{?R_Ru5Y6SL=)8x z(8~&iH5GN$079tEd?ru)E6YqE%GC5s5 z@Hpn7EYkHz*QKBw!op5ia!Bt(I3MZyxhRi|%K?5|dvSH=0gs8(4FlE#*v|p$0PG-e z+kmG#3;0m)YsgE#1MhDmZ!hu^k+vRb{{{Ga2|k0<_2Owp`ZlD;0JaWsJz#r*$5sZI zbhH;wx^(5}2bC#C9QDiTW1mI9_ZaX^0lr4y!#AziB|1jeRdp^Bs=iv)4KoTt9^``>Tg)NZ)-*seFC7dDk_v%E{^25O(~`R=5fE8dH0{%OVS zcg_#gKf5**m%Cm>vk{+L+n9|Dy1n=#hX#Hd*d0%#Zd6_a7=N9U)0rN_b0K&j@xGs( z{NeEYpS+eaH1yoJiigiwV=gwlV%xSrc%rN;XK2-mItUycA^9a|e(J%!tM0r!vA=uD z!SgT^Pv7vG`G#LUv|;MwMZfVc-1C!{hX)%DJf{2Bvp=*yo$9;gNb!`=j(z=wr-ruX zzcFQ^=hT<=kN&Xeua||nu?4T(^Y$Hon3eLk%;RM@y!gR&whmKElzQIN>x7>!I58_T zujGZ~um2X;@bIB;*QcGF7?^H5YG3)oiNAa5<?Y`Euo{zcm_9)I?dp+jFX zmR@%~d-hk~X?;6)S6$bdw_ZJwiLn^>*D0pvuf@3h8m0_I$zel|910iG?SJ|^gt-sA zcr}eHE6*!WIDXwr`@Z;N;l6?IPy6)Jj^%JQa>W^o>?`hfHM;bUmZo~w10L6+Do4J) z*j2Zp_MR1;A-6uD7Dgt!T zkJe}TNAe$sEOaw)QCck8DCZIHQrLz|C*@O|%2y!1R8ejg%E{}ivRs~`9F;8u+)hOr zd_CM=#1G+8;v+b@ol1PlvQ*zWlshlstGi0uPfPh!Km9fXF7}a;eo{S&h#PRpxCmyv z{wT{4uKj>ps=!5Mnh|f4(kP$c=%?(5vJB-N0o(xv9%@qu;wKci2xh!CjV(8bGQ+s! zF+F>ga=n0|y6H#t&EO%AaLMH^UZq?-U|1ok+)~6F6y)cVxJo(v zO^;Fabt8UGQOoIKlzhHcDoc4(cDn)}rO}V-+K==@xa9uszDixY6!@szIm87; zxf53@cUn=7>ZJB6+eT>u(q=)2r7*m&9Nq%rY*Ks=p2RyHc%H>Ih)eS*+KVd>*HT<- zaqY%+7*{v00bJ^x(7$lma4o{shHDqDL%2@kqPnPFS`+A}q#d88qZBrD`{$~?K8%-2K+WjW$& zxtuajE+@}H(tVZXXb#HdlzDPFc|MS?tSm?KK`y7vlgr66hIDIXIg&AQIc1()PUc7b zm~zCAayez5Tu$cy#4+WF|K)PZJh>deIT}~`DfyYkjDE^A8V~v@(-=dJNh3PaPYFjf zqMtI2`cFS)nx3VMPNR0yPYEZcaGVBu)}il>$P$vHorrhiQm$zP7bz7|j)$@=Wfzj( z_SgtMl0iDe5EUrXTdMSKolk>~K`R}OEBaX3NG;S@KAlg}JZ z`*JwJ%KaMGUvc4dB!?4o98Q68IHof0k7(PulGEK5{rF8pJM-fs?Nb(@JT?xEBd~Sf z0J~HHyYm}h4S=Qk%u*Q|`y<~_rdNS~@Ec$qO(X42fG3*j8vB#`2%i?qe+o}Zdj?Nx z&ta)Pntz4gfJ2A+2>(<(3CDM&`ibASe?!@gQrT@%8LGSM8_MXKNBTGX4Y0iuUTW72 zc!lw};wRI>rodbA4X}q4csG6n>|Wp{etK5IPklW24Q03o#WHFCfjOJ$ZS z%EZD`eMN_nAotlI!BV{N8(^Ci^znQHY`4_sj}(30`)|tF6pj2IY*jY@kS0InY-%T6 zXMszm%Xx$;?cx~xltw=~>p{e5o@0k1^ zMgA}9Io%Ol%62HrQ~IY5TscOvkJ+$W@@oQ)=As($cw94Z*|3;7aP7s_i7OXr<+xn9 zR^y_Qkz5ov#*(gUXyEc18ggqJD;pb{YU@gxR#Uvd<;iWRZEc-@U%hLYhf>O1_pfM$ zXl*-1I(P><#2|i+7Q7h$|k_ipMbQT3b?)G`$yTG3b;W^16-E^ z?l$Zbm;sllNZX9GU4R?!_rLow|M&Yb5nNuiGbcH>#Z~KZ<*jG|3mWtCT&q?ra~0P% z*52=GN$2X?R@ElYt^@l{;$#r9K)St+t25T6vrI0PE6x|wnX9Q{O|y%uL0W!G?Mhb} z@K-eDfT4l3V#P|A!_~qv;IGPeG}L-#=M@#w0rt6=FO8^TMN=L3J(gl`tdrtZ^Gb?~8EkoBQB{s( z9t%4nQEyRgtH<8b(uB>S>m%}3wAS9&;Hq$gICVuU?rW)SS(97a(9p^)BiQ1mIxpI= zqQO;y{#9{YLDam)6`mEf4J#gU<+dQSthS*X1YOb8$W4o|lecYbGWXM{B3JFIE5Nzv zh&=e@JXd5yN15@G9S9FDtPZ!Cy#h!lgx^Y@Vz20Z&tN)r!VCNII@8vbYK4X~L*Ct&|d{M9yoK z^BW=^F4qIauGUsC2-?#c>1b;8h^-k(t%xjcyY`wq6g#pEpnhDF%MUMMfRLx2-bknk$ zWi1{~69qIYJOE$GO&$r?xHv~70o2sF?(^Ockx=7qYI*>2AGIL4veC_WuFl@J%+<`e z{aG=m0+?1bV&cOOy$l1(r9@;Cc9v!%>Y%Z^qH5592RK!9jTh@8LbFlZNUMGYTwtoE zM%MHURgDzdPIbU--B=SQKuseiVkSF z>Uovr%iJznVp?d?xvzHF17phO8S^Cevo~V3bB(Fj8D53Qlw&I>t6(c;C-trPpv;Kh(!0q4w4%xzlf@U#>`!?#guMNP(LOEl!z zY>XLPt)tt5G7Q=Q4jX|VAGUIy(&)f~#taF?fR5^;5*BNr2dmrIx&e}lUZKtMhT(X9 z8qGG&@d}OKUZ>c7N7FcC+$o zNsmOjdz|zb)fI_=jNow4pWBJh-cFp$qQcT|=W&i(N0mswfk+cVPMjgC!QGBCP;}O4 zK39VHJlyjUrr&Q=|M;5ll0TQw$$niNK43o;r()?+ls$?77y*19oJ11OAm!uPfHO#R zdTBY%Bf;KeFb2-V8MriDChk7mu}{L?hO#nz9?C$2W_X%`Zw1Q2;fUYp^IGC5uDixL zx20$GwQzczqcY-}hx1*vI2A>!qyfDdsmqD97SuLUhk=`ov6>CI+3a-HTy6^BsSo0r zuts2N0Ih0)lkkbHxbp1SY@EMpz(4x6aMOXK2=Mo_(z)nSGq;BI@P3Rm6fUj+I4jX& zf)dYzQTq!JYsA&U%F!7$FKE_)_AXGYxjJq4jK_^w@hP- z{rB5%<*r5h#S>_CXu&eHc!UBn4aOS@$X-V8(PhU{T}gA|2UfyvnEfp!rkIpd0)dCJrFduW={9EG-kA7wOv`;de_Po%UYURo0fa- zf~uHN+q!c0s-)?9sB|lqyIN(_ORNp3^m?m@#Qr?!-x9Xlz5$!@HdYQLTV2b%uoKrv zaip}k9`vFXSDm9}#VY82_q$rdnaXT?8;a68S>#&fYS1^(J#%_(>%7KQO%J$Qrt7^c za+ZRN#9F)A?a9BPtwHXJCh$sekgf&@}H8=Cu@uu#%$vr<38i(#yry^(|Xfp(>~KP zre{qrnBFq|hpE@}chik2sVRjijVU`*gp`WZWvQ!DH>W<8I-DAx_CVS*X&q@Fq|G<4 zHh*e1r~e{-iseR2s-@6!%yPjpYMIp*)Dzm^`CVafPj zMv`@bb%}MQb*pu+bz0`nGY@A5Glw#t%(|2{Av>5&f`2>Ob-SV5uoCUsX9yb9Nw+0g zlblIMl9H2umRxV#VLWMk+4N`AKTQ!S(^EVt-%r_}(wTBFwI_92T5eifn#!y;Ys@-x zZu-*n)#*FZ_ov^S(US3_jP8uTWZYH+z3JE%t}d=X(vmHS`)HlGY~uI4L%nPd=1LaOpQ-76uGWGYVgQ;<8scD62%hEnfn_!MNr7_jJtw_2{RioL(@&=7XH;Z7obhDF{*2c%{+V%uWtzomX|?>ua?Wze5@XG^wp(Xr z=4QGw4`qIw`9VN?4EX2U$+MF)lM9nek}Hz$OscC3#KqlgZB{9|KoSFlvm~ z8P9;P{tV685qxliIl+9J z`3|$eoMz54+s#Gha`Qs-GV=qNDI3l0X5RdS`6uS*&2O0BGxwMUb5;6baBFA!cQR&X zWM(YPXv*+rTyIIV%(0j(=@y5j#^SQHSpt^b;G-_f8Oyh551*Jp0dd?a&c=98IwGJl$RAoEw?{J&@3oK=>!IqUtb ze`V!ougv~w_B+}C%7zla(SG)whI=6~erx!`a9h&dN#9NS5iQ{xp%+14awJtGorMHB zm(-hdK1oO#NE%GKm~jCy0DafWf0(O@(g%|@%y zX3R4d8jFk$V}-HWxX8HFSZ8z_8;s3HkFm|T*0|BQ*|^QP-MG`Z%eWg7X|Hj=@qqE5 z@sRPbvBP-8*l9dr>@uDZ~rV3LvB;8U|oyl!#Fg2SzrZ&@B(?&?XZKmy}ou*x; z-KIU@hXbZVrVdl5sms)D>VYH_OoOH&)6Udgsk>A6q#Dd7v(;=fZ#Hi;C#37sXQbQG z9qAS6)sO&f>D$t`r|-cW*q?qN{ZM*WdQbYf^z-S%>6#2(hCU-PV@8G{qcEd7V^Ky! zMsr46#?Fkrm?eiZIx>!AoX9wrF_1BsaWP{!BNjX`!!iq8P-IzTS!$`XG*~uUc7YG} zSoT|vSWa8IEoU*GE?QJpwN+z{wa&6ytu||(wa8j$^;p}iYpolt+aUK2Sr1z~tew^# zt6&`fmke2TnflDcOjD*g)0&x=xhQjKW?SaA%M)0pW(_CPi>9x%^U z2DL$NNHkatHq7@$29Kf5u+y;1aL{nb&}BGnIB&RU7=o16Bqb#2lMG3wq`aiUr0S$a zNexNONgI$^IA;;KrWri48~kz5blP+le8Ht?Qf8%? zQ>s(yQZ{3iJOnv$BISI_K*~@`JY?{!)S}et)HbY|`%@35c3`DarRmb*Avqms6=}_B z+tYTY9ZWlv)}4mA2BB=lBi1m>P-v(#Y&PsS95I|lZ*}OUBdHC&>csrhC7U7Nc4NK? PSi=i3m)627JM#NKAd=c{ literal 0 HcmV?d00001 diff --git a/Test Application/MainWindow.xaml b/Test Application/MainWindow.xaml new file mode 100644 index 0000000..5da99a4 --- /dev/null +++ b/Test Application/MainWindow.xaml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + diff --git a/Test Application/MainWindow.xaml.cs b/Test Application/MainWindow.xaml.cs new file mode 100644 index 0000000..59a7cc3 --- /dev/null +++ b/Test Application/MainWindow.xaml.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using Microsoft.Win32; + +namespace Test_Application +{ + /// + /// Interaktionslogik für MainWindow.xaml + /// + public partial class MainWindow : Window + { + public MainWindow() + { + InitializeComponent(); + } + + private void btnStop_Click(object sender, RoutedEventArgs e) + { + mediaUriElement.Stop(); + } + + private void btnOpen_Click(object sender, RoutedEventArgs e) + { + var dlg = new OpenFileDialog(); + var result = dlg.ShowDialog(); + if (result == true) + mediaUriElement.Source = new Uri(dlg.FileName); + } + } +} diff --git a/Test Application/Properties/AssemblyInfo.cs b/Test Application/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..56409f5 --- /dev/null +++ b/Test Application/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die einer Assembly zugeordnet sind. +[assembly: AssemblyTitle("Test Application")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Test Application")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. +[assembly: ComVisible(false)] + +//Um mit dem Erstellen lokalisierbarer Anwendungen zu beginnen, legen Sie +//ImCodeVerwendeteKultur in der .csproj-Datei +//in einer fest. Wenn Sie in den Quelldateien beispielsweise Deutsch +//(Deutschland) verwenden, legen Sie auf \"de-DE\" fest. Heben Sie dann die Auskommentierung +//des nachstehenden NeutralResourceLanguage-Attributs auf. Aktualisieren Sie "en-US" in der nachstehenden Zeile, +//sodass es mit der UICulture-Einstellung in der Projektdatei übereinstimmt. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher + //(wird verwendet, wenn eine Ressource auf der Seite + // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) + ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs + //(wird verwendet, wenn eine Ressource auf der Seite, in der Anwendung oder einem + // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) +)] + + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Test Application/Properties/Resources.Designer.cs b/Test Application/Properties/Resources.Designer.cs new file mode 100644 index 0000000..f4aae7a --- /dev/null +++ b/Test Application/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion: 4.0.30319.42000 +// +// Änderungen an dieser Datei können fehlerhaftes Verhalten verursachen und gehen verloren, wenn +// der Code neu generiert wird. +// +//------------------------------------------------------------------------------ + +namespace Test_Application.Properties +{ + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // Diese Klasse wurde von der StronglyTypedResourceBuilder-Klasse + // über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der Option /str erneut aus, oder erstellen Sie Ihr VS-Projekt neu. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Test_Application.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenlookups, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Test Application/Properties/Resources.resx b/Test Application/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Test Application/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Test Application/Properties/Settings.Designer.cs b/Test Application/Properties/Settings.Designer.cs new file mode 100644 index 0000000..6d89d45 --- /dev/null +++ b/Test Application/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Test_Application.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Test Application/Properties/Settings.settings b/Test Application/Properties/Settings.settings new file mode 100644 index 0000000..033d7a5 --- /dev/null +++ b/Test Application/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Test Application/Test Application.csproj b/Test Application/Test Application.csproj new file mode 100644 index 0000000..5c6e644 --- /dev/null +++ b/Test Application/Test Application.csproj @@ -0,0 +1,112 @@ + + + + + Debug + AnyCPU + {77DD70C4-DE32-4A31-AE22-675F5758FB5F} + WinExe + Properties + Test_Application + Test Application + v4.0 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + 4.0 + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + App.xaml + Code + + + MainWindow.xaml + Code + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + ResXFileCodeGenerator + Resources.Designer.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + {73154957-3d91-48da-8068-d425b523ed93} + WPF MediaKit + + + + + PreserveNewest + + + + + \ No newline at end of file diff --git a/WPF MediaKit.sln b/WPF MediaKit.sln index ef5adcc..75c1734 100644 --- a/WPF MediaKit.sln +++ b/WPF MediaKit.sln @@ -1,10 +1,12 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPF MediaKit", "Source\WPF MediaKit.csproj", "{73154957-3D91-48DA-8068-D425B523ED93}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test Application", "Test Application\Test Application.csproj", "{77DD70C4-DE32-4A31-AE22-675F5758FB5F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,6 +17,10 @@ Global {73154957-3D91-48DA-8068-D425B523ED93}.Debug|Any CPU.Build.0 = Debug|Any CPU {73154957-3D91-48DA-8068-D425B523ED93}.Release|Any CPU.ActiveCfg = Release|Any CPU {73154957-3D91-48DA-8068-D425B523ED93}.Release|Any CPU.Build.0 = Release|Any CPU + {77DD70C4-DE32-4A31-AE22-675F5758FB5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {77DD70C4-DE32-4A31-AE22-675F5758FB5F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77DD70C4-DE32-4A31-AE22-675F5758FB5F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {77DD70C4-DE32-4A31-AE22-675F5758FB5F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE