VorbisEncodeFilter.cpp

Go to the documentation of this file.
00001 //===========================================================================
00002 //Copyright (C) 2003, 2004 Zentaro Kavanagh
00003 //
00004 //Redistribution and use in source and binary forms, with or without
00005 //modification, are permitted provided that the following conditions
00006 //are met:
00007 //
00008 //- Redistributions of source code must retain the above copyright
00009 //  notice, this list of conditions and the following disclaimer.
00010 //
00011 //- Redistributions in binary form must reproduce the above copyright
00012 //  notice, this list of conditions and the following disclaimer in the
00013 //  documentation and/or other materials provided with the distribution.
00014 //
00015 //- Neither the name of Zentaro Kavanagh nor the names of contributors 
00016 //  may be used to endorse or promote products derived from this software 
00017 //  without specific prior written permission.
00018 //
00019 //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00020 //``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00021 //LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00022 //PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE ORGANISATION OR
00023 //CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00024 //EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00025 //PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00026 //PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00027 //LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00028 //NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00029 //SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00030 //===========================================================================
00031 
00032 #include "stdafx.h"
00033 #include "vorbisencodefilter.h"
00034 
00035 
00036 //COM Factory Template
00037 CFactoryTemplate g_Templates[] = 
00038 {
00039     { 
00040                 L"Vorbis Encode Filter",                                                // Name
00041             &CLSID_VorbisEncodeFilter,            // CLSID
00042             VorbisEncodeFilter::CreateInstance, // Method to create an instance of MyComponent
00043         NULL,                                                                   // Initialization function
00044         NULL                                                                    // Set-up information (for filters)
00045     }
00046 
00047 };
00048 
00049 // Generic way of determining the number of items in the template
00050 int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]); 
00051 
00052 CUnknown* WINAPI VorbisEncodeFilter::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr) 
00053 {
00054         //This routine is the COM implementation to create a new Filter
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         //Error checks ??
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         //Inputs Audio / PCM / WaveFormatEx
00084         //Outputs Audio / Vorbis / Vorbis
00085 
00086         //Vector to hold our set of media types we want to accept.
00087         vector<CMediaType*> locAcceptableTypes;
00088 
00089         //Setup the media types for the output pin.
00090         CMediaType* locAcceptMediaType = new CMediaType(&MEDIATYPE_Audio);              //Deleted in pin destructor
00091         locAcceptMediaType->subtype = MEDIASUBTYPE_Vorbis;
00092         locAcceptMediaType->formattype = FORMAT_Vorbis;
00093         
00094         locAcceptableTypes.push_back(locAcceptMediaType);
00095 
00096         //Output pin must be done first because it's passed to the input pin.
00097         mOutputPin = new VorbisEncodeOutputPin(this, m_pLock, locAcceptableTypes);                      //Deleted in base class destructor
00098 
00099         //Clear out the vector, now we've already passed it to the output pin.
00100         locAcceptableTypes.clear();
00101 
00102         //Setup the media Types for the input pin.
00103         locAcceptMediaType = NULL;
00104         locAcceptMediaType = new CMediaType(&MEDIATYPE_Audio);                  //Deleted by pin
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);    //Deleted in base class filter destructor.
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 }

Generated on Tue Feb 15 14:54:17 2005 for oggdsf by  doxygen 1.3.9