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 Files 00033 #include "stdafx.h" 00034 #include "SpeexDecodeFilter.h" 00035 00036 00037 //COM Factory Template 00038 CFactoryTemplate g_Templates[] = 00039 { 00040 { 00041 L"Speex Decode Filter", // Name 00042 &CLSID_SpeexDecodeFilter, // CLSID 00043 SpeexDecodeFilter::CreateInstance, // Method to create an instance of Speex Decoder 00044 NULL, // Initialization function 00045 NULL // Set-up information (for filters) 00046 } 00047 00048 }; 00049 00050 // Generic way of determining the number of items in the template 00051 int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]); 00052 00053 SpeexDecodeFilter::SpeexDecodeFilter() 00054 : AbstractTransformFilter(NAME("Speex Audio Decoder"), CLSID_SpeexDecodeFilter) 00055 , mSpeexFormatInfo(NULL) 00056 { 00057 00058 bool locWasConstructed = ConstructPins(); 00059 } 00060 00061 bool SpeexDecodeFilter::ConstructPins() 00062 { 00063 00064 //Vector to hold our set of media types we want to accept. 00065 vector<CMediaType*> locAcceptableTypes; 00066 00067 //Setup the media types for the output pin. 00068 CMediaType* locAcceptMediaType = new CMediaType(&MEDIATYPE_Audio); //Deleted in pin destructor 00069 locAcceptMediaType->subtype = MEDIASUBTYPE_PCM; 00070 locAcceptMediaType->formattype = FORMAT_WaveFormatEx; 00071 00072 locAcceptableTypes.push_back(locAcceptMediaType); 00073 00074 //Output pin must be done first because it's passed to the input pin. 00075 mOutputPin = new SpeexDecodeOutputPin(this, m_pLock, locAcceptableTypes); //Deleted in base class destructor 00076 00077 //Clear out the vector, now we've already passed it to the output pin. 00078 locAcceptableTypes.clear(); 00079 00080 //Setup the media Types for the input pin. 00081 locAcceptMediaType = NULL; 00082 locAcceptMediaType = new CMediaType(&MEDIATYPE_Audio); //Deleted by pin 00083 00084 locAcceptMediaType->subtype = MEDIASUBTYPE_Speex; 00085 locAcceptMediaType->formattype = FORMAT_Speex; 00086 00087 locAcceptableTypes.push_back(locAcceptMediaType); 00088 00089 mInputPin = new SpeexDecodeInputPin(this, m_pLock, mOutputPin, locAcceptableTypes); //Deleted in base class filter destructor. 00090 return true; 00091 00092 } 00093 00094 SpeexDecodeFilter::~SpeexDecodeFilter(void) 00095 { 00096 delete mSpeexFormatInfo; 00097 } 00098 00099 CUnknown* WINAPI SpeexDecodeFilter::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr) 00100 { 00101 //This routine is the COM implementation to create a new Filter 00102 SpeexDecodeFilter *pNewObject = new SpeexDecodeFilter(); 00103 if (pNewObject == NULL) { 00104 *pHr = E_OUTOFMEMORY; 00105 } 00106 return pNewObject; 00107 } 00108 00109 //QUERY::: Do we need these ? Aren't we all friedns here ?? 00110 //RESULT::: Keep them, set function must be kept... get could go... but keep for consistency 00111 sSpeexFormatBlock* SpeexDecodeFilter::getSpeexFormatBlock() 00112 { 00113 return mSpeexFormatInfo; 00114 } 00115 void SpeexDecodeFilter::setSpeexFormat(sSpeexFormatBlock* inFormatBlock) 00116 { 00117 delete mSpeexFormatInfo; 00118 mSpeexFormatInfo = new sSpeexFormatBlock; 00119 *mSpeexFormatInfo = *inFormatBlock; 00120 }