Graph.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using DirectShow;
  2. using Sonic;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Diagnostics;
  6. using System.Runtime.InteropServices;
  7. namespace VideoPlayLib
  8. {
  9. internal class Graph : BaseObject, IDisposable
  10. {
  11. //---- fields
  12. private readonly FilterGraph _value;
  13. private readonly IFilterGraph2 _filterGraph;
  14. private readonly IGraphBuilder _graph;
  15. private readonly IMediaControl _control;
  16. private readonly IMediaPosition _position;
  17. //---- ctor
  18. public Graph()
  19. {
  20. _value = new FilterGraph();
  21. _filterGraph = (IFilterGraph2)_value;
  22. _graph = (IGraphBuilder)_value;
  23. _control = (IMediaControl)_value;
  24. _position = (IMediaPosition)_value;
  25. }
  26. //---- wraps
  27. public FilterGraph Value { get { return _value; } }
  28. public List<DSFilter> GetAllFilters()
  29. {
  30. var lst = new List<DSFilter>();
  31. {
  32. IEnumFilters ief;
  33. _graph.EnumFilters(out ief);
  34. var arr = new IBaseFilter[1];
  35. while (ief.Next(1, arr, IntPtr.Zero) == 0)
  36. {
  37. Debug.Assert(arr[0] != null, "arr[0] != null");
  38. lst.Add(new DSFilter(arr[0]));
  39. }
  40. }
  41. return lst;
  42. }
  43. [DebuggerHidden]
  44. public DSFilter AddFilter(DSFilter filter, string name)
  45. {
  46. CheckError(_graph.AddFilter(filter.Value, name));
  47. return filter;
  48. }
  49. [DebuggerHidden]
  50. public DSFilter AddSourceFilter(string filename, string name)
  51. {
  52. IBaseFilter filter;
  53. CheckError(_graph.AddSourceFilter(filename, name, out filter));
  54. return new DSFilter(filter);
  55. }
  56. [DebuggerHidden]
  57. public void Connect(DSPin inoutPin, DSPin outputPin)
  58. {
  59. CheckError(_graph.Connect(inoutPin.Value, outputPin.Value));
  60. }
  61. [DebuggerHidden]
  62. public void Disconnect(DSPin inoutPin)
  63. {
  64. CheckError(_graph.Disconnect(inoutPin.Value));
  65. }
  66. [DebuggerHidden]
  67. public void RemoveFilter(DSFilter filter)
  68. {
  69. CheckError(_graph.RemoveFilter(filter.Value));
  70. }
  71. [DebuggerHidden]
  72. public void Stop()
  73. {
  74. CheckError(_control.Stop());
  75. }
  76. [DebuggerHidden]
  77. public void Run()
  78. {
  79. CheckError(_control.Run());
  80. }
  81. [DebuggerHidden]
  82. public void Pause()
  83. {
  84. CheckError(_control.Pause());
  85. }
  86. [DebuggerHidden]
  87. public void Abort()
  88. {
  89. Stop();
  90. var lst = GetAllFilters();
  91. lst.ForEach(RemoveFilter);
  92. lst.ForEach(p => p.Dispose());
  93. CheckError(_graph.Abort());
  94. Marshal.ReleaseComObject(_graph);
  95. }
  96. [DebuggerHidden]
  97. public FilterState GetState(int timeOut = 0)
  98. {
  99. FilterState result;
  100. CheckError(_control.GetState(timeOut, out result));
  101. return result;
  102. }
  103. [DebuggerHidden]
  104. public double CurrentPosition
  105. {
  106. get
  107. {
  108. double tmp;
  109. CheckError(_position.get_CurrentPosition(out tmp));
  110. return tmp;
  111. }
  112. set
  113. {
  114. CheckError(_position.put_CurrentPosition(value));
  115. }
  116. }
  117. [DebuggerHidden]
  118. public double Duration
  119. {
  120. get
  121. {
  122. double tmp;
  123. CheckError(_position.get_Duration(out tmp));
  124. return tmp;
  125. }
  126. }
  127. [DebuggerHidden]
  128. public DSFilter AddDeviceFilter(DSDevice device)
  129. {
  130. IBaseFilter filter;
  131. CheckError(_filterGraph.AddSourceFilterForMoniker(device.Value, null, device.Name, out filter));
  132. return new DSFilter(filter);
  133. }
  134. public void Dispose()
  135. {
  136. //TODO: release resource
  137. Abort();
  138. }
  139. }
  140. }