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 00034 00035 #include "FLACEncodeFilter.h" 00036 00037 00038 //COM Factory Template 00039 CFactoryTemplate g_Templates[] = 00040 { 00041 { 00042 L"FLAC Encode Filter", // Name 00043 &CLSID_FLACEncodeFilter, // CLSID 00044 FLACEncodeFilter::CreateInstance, // Method to create an instance of MyComponent 00045 NULL, // Initialization function 00046 NULL // Set-up information (for filters) 00047 } 00048 00049 }; 00050 00051 // Generic way of determining the number of items in the template 00052 int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]); 00053 00054 CUnknown* WINAPI FLACEncodeFilter::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr) 00055 { 00056 //This routine is the COM implementation to create a new Filter 00057 FLACEncodeFilter *pNewObject = new FLACEncodeFilter(); 00058 if (pNewObject == NULL) { 00059 *pHr = E_OUTOFMEMORY; 00060 } 00061 return pNewObject; 00062 } 00063 00064 FLACEncodeFilter::FLACEncodeFilter(void) 00065 : AbstractTransformFilter(NAME("FLAC Encoder"), CLSID_FLACEncodeFilter) 00066 { 00067 bool locWasConstructed = ConstructPins(); 00068 } 00069 00070 FLACEncodeFilter::~FLACEncodeFilter(void) 00071 { 00072 } 00073 00074 bool FLACEncodeFilter::ConstructPins() 00075 { 00076 //Input : Audio / PCM / WaveFormatEx 00077 //Output : Audio / FLAC_1_0 / FLAC 00078 00079 00080 //Vector to hold our set of media types we want to accept. 00081 vector<CMediaType*> locAcceptableTypes; 00082 00083 //Setup the media types for the output pin. 00084 CMediaType* locAcceptMediaType = new CMediaType(&MEDIATYPE_Audio); //Deleted in pin destructor 00085 locAcceptMediaType->subtype = MEDIASUBTYPE_OggFLAC_1_0; 00086 locAcceptMediaType->formattype = FORMAT_FLAC; 00087 00088 locAcceptableTypes.push_back(locAcceptMediaType); 00089 00090 //Output pin must be done first because it's passed to the input pin. 00091 mOutputPin = new FLACEncodeOutputPin(this, m_pLock, locAcceptableTypes); //Deleted in base class destructor 00092 00093 //Clear out the vector, now we've already passed it to the output pin. 00094 locAcceptableTypes.clear(); 00095 00096 //Setup the media Types for the input pin. 00097 locAcceptMediaType = NULL; 00098 locAcceptMediaType = new CMediaType(&MEDIATYPE_Audio); //Deleted by pin 00099 00100 locAcceptMediaType->subtype = MEDIASUBTYPE_PCM; 00101 locAcceptMediaType->formattype = FORMAT_WaveFormatEx; 00102 00103 locAcceptableTypes.push_back(locAcceptMediaType); 00104 00105 mInputPin = new FLACEncodeInputPin(this, m_pLock, mOutputPin, locAcceptableTypes); //Deleted in base class filter destructor. 00106 return true; 00107 00108 }