00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "stdafx.h"
00033 #include "vorbisencodefilter.h"
00034
00035
00036
00037 CFactoryTemplate g_Templates[] =
00038 {
00039 {
00040 L"Vorbis Encode Filter",
00041 &CLSID_VorbisEncodeFilter,
00042 VorbisEncodeFilter::CreateInstance,
00043 NULL,
00044 NULL
00045 }
00046
00047 };
00048
00049
00050 int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);
00051
00052 CUnknown* WINAPI VorbisEncodeFilter::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr)
00053 {
00054
00055 VorbisEncodeFilter *pNewObject = new VorbisEncodeFilter();
00056 if (pNewObject == NULL) {
00057 *pHr = E_OUTOFMEMORY;
00058 }
00059 return pNewObject;
00060 }
00061
00062 VorbisEncodeFilter::VorbisEncodeFilter(void)
00063 : AbstractTransformFilter(NAME("Vorbis Encoder"), CLSID_VorbisEncodeFilter)
00064 {
00065 bool locWasConstructed = ConstructPins();
00066
00067 }
00068
00069 VorbisEncodeFilter::~VorbisEncodeFilter(void)
00070 {
00071 }
00072
00073 STDMETHODIMP VorbisEncodeFilter::NonDelegatingQueryInterface(REFIID riid, void **ppv) {
00074 if (riid == IID_IVorbisEncodeSettings) {
00075 *ppv = (IVorbisEncodeSettings*)this;
00076 ((IUnknown*)*ppv)->AddRef();
00077 return NOERROR;
00078 }
00079 return AbstractTransformFilter::NonDelegatingQueryInterface(riid, ppv);
00080 }
00081 bool VorbisEncodeFilter::ConstructPins()
00082 {
00083
00084
00085
00086
00087 vector<CMediaType*> locAcceptableTypes;
00088
00089
00090 CMediaType* locAcceptMediaType = new CMediaType(&MEDIATYPE_Audio);
00091 locAcceptMediaType->subtype = MEDIASUBTYPE_Vorbis;
00092 locAcceptMediaType->formattype = FORMAT_Vorbis;
00093
00094 locAcceptableTypes.push_back(locAcceptMediaType);
00095
00096
00097 mOutputPin = new VorbisEncodeOutputPin(this, m_pLock, locAcceptableTypes);
00098
00099
00100 locAcceptableTypes.clear();
00101
00102
00103 locAcceptMediaType = NULL;
00104 locAcceptMediaType = new CMediaType(&MEDIATYPE_Audio);
00105
00106 locAcceptMediaType->subtype = MEDIASUBTYPE_PCM;
00107 locAcceptMediaType->formattype = FORMAT_WaveFormatEx;
00108
00109 locAcceptableTypes.push_back(locAcceptMediaType);
00110
00111 mInputPin = new VorbisEncodeInputPin(this, m_pLock, mOutputPin, locAcceptableTypes);
00112 return true;
00113 }
00114
00115
00116 STDMETHODIMP_(signed char) VorbisEncodeFilter::quality() {
00117 return (signed char)( ((VorbisEncodeInputPin*)mInputPin)->mVorbisQuality * 100 );
00118 }
00119
00120
00121 STDMETHODIMP_(bool) VorbisEncodeFilter::setQuality(signed char inQuality) {
00122
00123 if ((inQuality >= 0) && (inQuality < 100)) {
00124
00125 ((VorbisEncodeInputPin*)mInputPin)->mVorbisQuality = (float)inQuality/(float)100;
00126
00127 return true;
00128 } else {
00129
00130 return false;
00131 }
00132 }