summaryrefslogtreecommitdiffstats
path: root/dom/media/directshow/AudioSinkFilter.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/directshow/AudioSinkFilter.h')
-rw-r--r--dom/media/directshow/AudioSinkFilter.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/dom/media/directshow/AudioSinkFilter.h b/dom/media/directshow/AudioSinkFilter.h
new file mode 100644
index 000000000..85abdfccf
--- /dev/null
+++ b/dom/media/directshow/AudioSinkFilter.h
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(AudioSinkFilter_h_)
+#define AudioSinkFilter_h_
+
+#include "BaseFilter.h"
+#include "DirectShowUtils.h"
+#include "nsAutoPtr.h"
+#include "mozilla/RefPtr.h"
+
+namespace mozilla {
+
+class AudioSinkInputPin;
+class SampleSink;
+
+// Filter that acts as the end of the graph. Audio samples input into
+// this filter block the calling thread, and the calling thread is
+// unblocked when the decode thread extracts the sample. The samples
+// input into this filter are stored in the SampleSink, where the blocking
+// is implemented. The input pin owns the SampleSink.
+class AudioSinkFilter: public mozilla::media::BaseFilter,
+ public IMediaSeeking
+{
+
+public:
+ AudioSinkFilter(const wchar_t* aObjectName, HRESULT* aOutResult);
+ virtual ~AudioSinkFilter();
+
+ // Gets the input pin's sample sink.
+ SampleSink* GetSampleSink();
+
+ // IUnknown implementation.
+ STDMETHODIMP QueryInterface(REFIID aIId, void **aInterface);
+ STDMETHODIMP_(ULONG) AddRef();
+ STDMETHODIMP_(ULONG) Release();
+
+ // --------------------------------------------------------------------
+ // CBaseFilter methods
+ int GetPinCount ();
+ mozilla::media::BasePin* GetPin ( IN int Index);
+ STDMETHODIMP Pause ();
+ STDMETHODIMP Stop ();
+ STDMETHODIMP GetClassID ( OUT CLSID * pCLSID);
+ STDMETHODIMP Run(REFERENCE_TIME tStart);
+ // IMediaSeeking Methods...
+
+ // We defer to SourceFilter, but we must expose the interface on
+ // the output pins. Seeking commands come upstream from the renderers,
+ // but they must be actioned at the source filters.
+ STDMETHODIMP GetCapabilities(DWORD* aCapabilities);
+ STDMETHODIMP CheckCapabilities(DWORD* aCapabilities);
+ STDMETHODIMP IsFormatSupported(const GUID* aFormat);
+ STDMETHODIMP QueryPreferredFormat(GUID* aFormat);
+ STDMETHODIMP GetTimeFormat(GUID* aFormat);
+ STDMETHODIMP IsUsingTimeFormat(const GUID* aFormat);
+ STDMETHODIMP SetTimeFormat(const GUID* aFormat);
+ STDMETHODIMP GetDuration(LONGLONG* pDuration);
+ STDMETHODIMP GetStopPosition(LONGLONG* pStop);
+ STDMETHODIMP GetCurrentPosition(LONGLONG* aCurrent);
+ STDMETHODIMP ConvertTimeFormat(LONGLONG* aTarget,
+ const GUID* aTargetFormat,
+ LONGLONG aSource,
+ const GUID* aSourceFormat);
+ STDMETHODIMP SetPositions(LONGLONG* aCurrent,
+ DWORD aCurrentFlags,
+ LONGLONG* aStop,
+ DWORD aStopFlags);
+ STDMETHODIMP GetPositions(LONGLONG* aCurrent,
+ LONGLONG* aStop);
+ STDMETHODIMP GetAvailable(LONGLONG* aEarliest,
+ LONGLONG* aLatest);
+ STDMETHODIMP SetRate(double aRate);
+ STDMETHODIMP GetRate(double* aRate);
+ STDMETHODIMP GetPreroll(LONGLONG* aPreroll);
+
+ // --------------------------------------------------------------------
+ // class factory calls this
+ static IUnknown * CreateInstance (IN LPUNKNOWN punk, OUT HRESULT * phr);
+
+private:
+ CriticalSection mFilterCritSec;
+
+ // Note: The input pin defers its refcounting to the sink filter, so when
+ // the input pin is addrefed, what actually happens is the sink filter is
+ // addrefed.
+ nsAutoPtr<AudioSinkInputPin> mInputPin;
+};
+
+} // namespace mozilla
+
+#endif // AudioSinkFilter_h_