FLACDecodeFilter.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 "FLACDecodeFilter.h"
00034 
00035 
00036 //COM Factory Template
00037 CFactoryTemplate g_Templates[] = 
00038 {
00039     { 
00040                 L"FLAC Decode Filter",                                          // Name
00041             &CLSID_FLACDecodeFilter,            // CLSID
00042             FLACDecodeFilter::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 FLACDecodeFilter::FLACDecodeFilter(void)
00053         :       AbstractTransformFilter(NAME("FLAC Audio Decoder"), CLSID_FLACDecodeFilter)
00054         ,       mFLACFormatBlock(NULL)
00055 {
00056         bool locWasConstructed = ConstructPins();
00057 }
00058 
00059 FLACDecodeFilter::~FLACDecodeFilter(void)
00060 {
00061         delete mFLACFormatBlock;
00062         mFLACFormatBlock = NULL;
00063 }
00064 
00065 bool FLACDecodeFilter::ConstructPins() 
00066 {
00067         //Vector to hold our set of media types we want to accept.
00068         vector<CMediaType*> locAcceptableTypes;
00069 
00070         //Setup the media types for the output pin.
00071         CMediaType* locAcceptMediaType = new CMediaType(&MEDIATYPE_Audio);              //Deleted in pin destructor
00072         locAcceptMediaType->subtype = MEDIASUBTYPE_PCM;
00073         locAcceptMediaType->formattype = FORMAT_WaveFormatEx;
00074         
00075         locAcceptableTypes.push_back(locAcceptMediaType);
00076 
00077         //Output pin must be done first because it's passed to the input pin.
00078         mOutputPin = new FLACDecodeOutputPin(this, m_pLock, locAcceptableTypes);                        //Deleted in base class destructor
00079 
00080         //Clear out the vector, now we've already passed it to the output pin.
00081         locAcceptableTypes.clear();
00082 
00083         //Setup the media Types for the input pin.
00084         locAcceptMediaType = NULL;
00085         locAcceptMediaType = new CMediaType(&MEDIATYPE_Audio);                  //Deleted by pin
00086 
00087         locAcceptMediaType->subtype = MEDIASUBTYPE_FLAC;
00088         locAcceptMediaType->formattype = FORMAT_FLAC;
00089 
00090         locAcceptableTypes.push_back(locAcceptMediaType);
00091         
00092         mInputPin = new FLACDecodeInputPin(this, m_pLock, mOutputPin, locAcceptableTypes);      //Deleted in base class filter destructor.
00093         return true;
00094 
00095 }
00096 
00097 CUnknown* WINAPI FLACDecodeFilter::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr) 
00098 {
00099         //This routine is the COM implementation to create a new Filter
00100         FLACDecodeFilter *pNewObject = new FLACDecodeFilter();
00101     if (pNewObject == NULL) {
00102         *pHr = E_OUTOFMEMORY;
00103     }
00104         return pNewObject;
00105 } 
00106 
00107 sFLACFormatBlock* FLACDecodeFilter::getFLACFormatBlock() 
00108 {
00109         return mFLACFormatBlock;
00110 }
00111 void FLACDecodeFilter::setFLACFormatBlock(sFLACFormatBlock* inFormatBlock) 
00112 {
00113         delete mFLACFormatBlock;
00114         mFLACFormatBlock = new sFLACFormatBlock;                //Deleted in destructor.
00115         *mFLACFormatBlock = *inFormatBlock;
00116 }

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