p align="left">{CKsAudRenPin * pPin = (CKsAudRenPin*)pNode; // To only look at non-digital output pins, check that pPin->IsVolumeSupported() is TRUE, // as digital output pins don't have volume controls associated with them. if(pPin->IsFormatSupported()) {/ This should be a valid pin TRACE_LEAVE(); return pPin;}} TRACE_LEAVE(); return NULL;} В файле audfilter.h Что заменить: CKsAudRenPin* CreateRenderPin(const WAVEFORMATEX* pwfx, BOOL fLooped); Заменить на: CKsAudRenPin * CreateRenderPin(BOOL fLooped); Что заменить: CKsAudRenPin* FindViablePin(const WAVEFORMATEX* pwfx); Заменить на: CKsAudRenPin * FindViablePin(); В файле audpin.cpp Что заменить: BOOL CKsAudPin::IsFormatSupported(const WAVEFORMATEX* pwfx) {TRACE_ENTER(); LISTPOS listPosRange = m_listDataRange.GetHeadPosition(); KSDATARANGE_AUDIO* pKSDATARANGE_AUDIO; while( m_listDataRange.GetNext( listPosRange, &pKSDATARANGE_AUDIO ) ) {if( KSDATAFORMAT_TYPE_WILDCARD == pKSDATARANGE_AUDIO->DataRange.MajorFormat || KSDATAFORMAT_TYPE_AUDIO == pKSDATARANGE_AUDIO->DataRange.MajorFormat ) {// Set the format to search for GUID guidFormat = {DEFINE_WAVEFORMATEX_GUID(pwfx->wFormatTag)}; // If this is a WaveFormatExtensible structure, then use its defined SubFormat if( WAVE_FORMAT_EXTENSIBLE == pwfx->wFormatTag ) {guidFormat = ((WAVEFORMATEXTENSIBLE *)pwfx)->SubFormat;} if( KSDATAFORMAT_SUBTYPE_WILDCARD == pKSDATARANGE_AUDIO->DataRange.SubFormat || guidFormat == pKSDATARANGE_AUDIO->DataRange.SubFormat ) {if( KSDATAFORMAT_SPECIFIER_WILDCARD == pKSDATARANGE_AUDIO->DataRange.Specifier || KSDATAFORMAT_SPECIFIER_WAVEFORMATEX == pKSDATARANGE_AUDIO->DataRange.Specifier ) {if( pKSDATARANGE_AUDIO->MaximumChannels >= pwfx->nChannels && pKSDATARANGE_AUDIO->MinimumBitsPerSample <= pwfx->wBitsPerSample && pKSDATARANGE_AUDIO->MaximumBitsPerSample >= pwfx->wBitsPerSample && pKSDATARANGE_AUDIO->MinimumSampleFrequency <= pwfx->nSamplesPerSec && pKSDATARANGE_AUDIO->MaximumSampleFrequency >= pwfx->nSamplesPerSec ) {// This should be a valid pin TRACE_LEAVE(); return TRUE;}}}}} TRACE_LEAVE(); return FALSE;} Заменить на: BOOL CKsAudPin::IsFormatSupported() {TRACE_ENTER(); LISTPOS listPosRange = m_listDataRange.GetHeadPosition(); KSDATARANGE_MUSIC * pKSDATARANGE_MUSIC; while(m_listDataRange.GetNext(listPosRange, &pKSDATARANGE_MUSIC)) {if(KSDATAFORMAT_TYPE_WILDCARD == pKSDATARANGE_MUSIC->DataRange.MajorFormat ||KSDATAFORMAT_TYPE_MUSIC == pKSDATARANGE_MUSIC->DataRange.MajorFormat) {if(KSDATAFORMAT_SUBTYPE_WILDCARD == pKSDATARANGE_MUSIC->DataRange.SubFormat ||KSDATAFORMAT_SUBTYPE_MIDI == pKSDATARANGE_MUSIC->DataRange.SubFormat) {if(KSDATAFORMAT_SPECIFIER_WILDCARD == pKSDATARANGE_MUSIC->DataRange.Specifier ||KSDATAFORMAT_SPECIFIER_NONE == pKSDATARANGE_MUSIC->DataRange.Specifier) {if(KSMUSIC_TECHNOLOGY_SWSYNTH == pKSDATARANGE_MUSIC->Technology) {// This should be a valid pin TRACE_LEAVE(); return TRUE;}}}}} TRACE_LEAVE(); return FALSE;} Что заменить: HRESULT CKsAudPin::Init() {TRACE_ENTER(); HRESULT hr = S_OK; BOOL fViablePin = FALSE; // Make sure at least one interface is standard streaming if (SUCCEEDED(hr)) {fViablePin = FALSE; for(ULONG i = 0; i < m_Descriptor.cInterfaces && !fViablePin; i++) fViablePin = fViablePin if (!fViablePin) {DebugPrintf(TRACE_ERROR, TEXT("No standard streaming interfaces on the pin")); hr = E_FAIL;}} // Make sure at least one medium is standard streaming if (SUCCEEDED(hr)) {fViablePin = FALSE; for(ULONG i = 0; i < m_Descriptor.cInterfaces && !fViablePin; i++) IsEqualGUIDAligned(m_Descriptor.pMediums[i].Set, KSMEDIUMSETID_Standard) && (m_Descriptor.pMediums[i].Id == KSMEDIUM_STANDARD_DEVIO) ; if (!fViablePin) {DebugPrintf(TRACE_ERROR, TEXT("No standard streaming mediums on the pin")); hr = E_FAIL;}} // Make sure at least one datarange supports audio if (SUCCEEDED(hr)) {fViablePin = FALSE; PKSDATARANGE pDataRange = m_Descriptor.pDataRanges; for(ULONG i = 0; i < m_Descriptor.cDataRanges; i++) {// SubType should either be compatible with WAVEFORMATEX or // it should be WILDCARD fViablePin = fViablePin || IS_VALID_WAVEFORMATEX_GUID(&pDataRange->SubFormat) || IsEqualGUIDAligned(pDataRange->SubFormat, KSDATAFORMAT_SUBTYPE_PCM) || IsEqualGUIDAligned(pDataRange->SubFormat, KSDATAFORMAT_SUBTYPE_WILDCARD); if (fViablePin && IsEqualGUIDAligned(pDataRange->MajorFormat, KSDATAFORMAT_TYPE_AUDIO)) {// Copy the data range into the pin PKSDATARANGE_AUDIO pCopyDataRangeAudio = new KSDATARANGE_AUDIO; if( pCopyDataRangeAudio ) {PKSDATARANGE_AUDIO pDataRangeAudio = (PKSDATARANGE_AUDIO)pDataRange; CopyMemory( pCopyDataRangeAudio, pDataRangeAudio, sizeof(KSDATARANGE_AUDIO) ); if (NULL == m_listDataRange.AddTail( pCopyDataRangeAudio )) {delete pCopyDataRangeAudio; pCopyDataRangeAudio = NULL; DebugPrintf(TRACE_ERROR, TEXT("Unable to allocate list entry to save datarange in")); hr = E_OUTOFMEMORY;}} else {DebugPrintf(TRACE_ERROR, TEXT("Unable to allocate memory to save datarange in")); hr = E_OUTOFMEMORY;}} pDataRange = (PKSDATARANGE)( ((PBYTE)pDataRange) + pDataRange->FormatSize);} if (!fViablePin) {DebugPrintf(TRACE_ERROR, TEXT("No audio dataranges on the pin")); hr = E_FAIL;}} TRACE_LEAVE_HRESULT(hr); return hr;} Заменить на: HRESULT CKsAudPin::Init() {TRACE_ENTER(); HRESULT hr = S_OK; BOOL fViablePin = FALSE; // Make sure at least one interface is standard streaming if (SUCCEEDED(hr)) {fViablePin = FALSE; for(ULONG i = 0; i < m_Descriptor.cInterfaces && !fViablePin; i++) fViablePin = fViablePin if (!fViablePin) {DebugPrintf(TRACE_ERROR, TEXT("No standard streaming interfaces on the pin")); hr = E_FAIL;}} // Make sure at least one medium is standard streaming if (SUCCEEDED(hr)) {fViablePin = FALSE; for(ULONG i = 0; i < m_Descriptor.cInterfaces && !fViablePin; i++) if (!fViablePin) {DebugPrintf(TRACE_ERROR, TEXT("No standard streaming mediums on the pin")); hr = E_FAIL;}} // Make sure at least one datarange supports audio if (SUCCEEDED(hr)) {fViablePin = FALSE; PKSDATARANGE pDataRange = m_Descriptor.pDataRanges; for(ULONG i = 0; i < m_Descriptor.cDataRanges; i++) {fViablePin = fViablePin || IsEqualGUIDAligned(pDataRange->SubFormat, KSDATAFORMAT_SUBTYPE_MIDI) || IsEqualGUIDAligned(pDataRange->SubFormat, KSDATAFORMAT_SUBTYPE_WILDCARD); if (fViablePin && IsEqualGUIDAligned(pDataRange->MajorFormat, KSDATAFORMAT_TYPE_MUSIC)) {// Copy the data range into the pin PKSDATARANGE_MUSIC pCopyDataRangeAudio = new KSDATARANGE_MUSIC; if( pCopyDataRangeAudio ) {PKSDATARANGE_MUSIC pDataRangeAudio = (PKSDATARANGE_MUSIC)pDataRange; CopyMemory( pCopyDataRangeAudio, pDataRangeAudio, sizeof(KSDATARANGE_MUSIC) ); if (NULL == m_listDataRange.AddTail( pCopyDataRangeAudio )) {delete pCopyDataRangeAudio; pCopyDataRangeAudio = NULL; DebugPrintf(TRACE_ERROR, TEXT("Unable to allocate list entry to save datarange in")); hr = E_OUTOFMEMORY;}} else {DebugPrintf(TRACE_ERROR, TEXT("Unable to allocate memory to save datarange in")); hr = E_OUTOFMEMORY;}} pDataRange = (PKSDATARANGE)( ((PBYTE)pDataRange) + pDataRange->FormatSize);} if (!fViablePin) {DebugPrintf(TRACE_ERROR, TEXT("No audio dataranges on the pin")); hr = E_FAIL;}} TRACE_LEAVE_HRESULT(hr); return hr;} Что заменить: CKsAudPin::~CKsAudPin(void) {TRACE_ENTER(); KSDATARANGE_AUDIO *pKSDATARANGE_AUDIO; CKsNode *pKsNode; // Clear datarange list while( m_listDataRange.RemoveHead(&pKSDATARANGE_AUDIO) ) {delete pKSDATARANGE_AUDIO;} // Clear the node list while( m_listNodes.RemoveHead(&pKsNode) ) {delete pKsNode;} delete[] (BYTE *)m_pWaveFormatEx; TRACE_LEAVE(); return;} Заменить на: CKsAudPin::~CKsAudPin(void) {TRACE_ENTER(); KSDATARANGE_MUSIC * pKSDATARANGE_MUSIC; CKsNode * pKsNode; // Clear datarange list while(m_listDataRange.RemoveHead(&pKSDATARANGE_MUSIC)) {delete pKSDATARANGE_MUSIC;} // Clear the node list while(m_listNodes.RemoveHead(&pKsNode)) {delete pKsNode;} TRACE_LEAVE(); return;} Что заменить: CKsAudPin::CKsAudPin (CKsAudFilter* pFilter, ULONG nId, HRESULT* phr ) : CKsPin(pFilter, nId, phr), m_pAudFilter(pFilter), m_pWaveFormatEx(NULL), m_pksDataFormatWfx(NULL) {TRACE_ENTER(); HRESULT hr = *phr; if (SUCCEEDED(hr)) {hr = m_listDataRange.Initialize(1); if (FAILED(hr)) DebugPrintf(TRACE_ERROR,TEXT("Failed to Initialize m_listDataRange"));} if (SUCCEEDED(hr)) {hr = m_listNodes.Initialize(1); if (FAILED(hr)) DebugPrintf(TRACE_ERROR,TEXT("Failed to Initialize m_listNodes"));} // create a KSPIN_CONNECT structure to describe a waveformatex pin if (SUCCEEDED(hr)) {m_cbPinCreateSize = sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT_WAVEFORMATEX); m_pksPinCreate = (PKSPIN_CONNECT)new BYTE[m_cbPinCreateSize]; if (!m_pksPinCreate) {DebugPrintf(TRACE_ERROR,TEXT("Failed to allocate m_pksPinCreate")); hr = E_OUTOFMEMORY;}} if (SUCCEEDED(hr)) {m_pksPinCreate->Interface.Set = KSINTERFACESETID_Standard; m_pksPinCreate->Interface.Id = KSINTERFACE_STANDARD_STREAMING; m_pksPinCreate->Interface.Flags = 0; m_pksPinCreate->Medium.Set = KSMEDIUMSETID_Standard; m_pksPinCreate->Medium.Id = KSMEDIUM_TYPE_ANYINSTANCE; m_pksPinCreate->Medium.Flags = 0; m_pksPinCreate->PinId = nId; m_pksPinCreate->PinToHandle = NULL; m_pksPinCreate->Priority.PriorityClass = KSPRIORITY_NORMAL; m_pksPinCreate->Priority.PrioritySubClass = 1; // point m_pksDataFormatWfx to just after the pConnect struct PKSDATAFORMAT_WAVEFORMATEX pksDataFormatWfx = (PKSDATAFORMAT_WAVEFORMATEX)(m_pksPinCreate + 1); // set up format for KSDATAFORMAT_WAVEFORMATEX pksDataFormatWfx->DataFormat.FormatSize = sizeof(KSDATAFORMAT_WAVEFORMATEX); pksDataFormatWfx->DataFormat.Flags = 0; pksDataFormatWfx->DataFormat.Reserved = 0; pksDataFormatWfx->DataFormat.MajorFormat = KSDATAFORMAT_TYPE_AUDIO; pksDataFormatWfx->DataFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; pksDataFormatWfx->DataFormat.Specifier = KSDATAFORMAT_SPECIFIER_WAVEFORMATEX; m_pksDataFormatWfx = pksDataFormatWfx;} // Initialize the Pin; if (SUCCEEDED(hr)) {hr = CKsAudPin::Init();} TRACE_LEAVE_HRESULT(hr); *phr = hr; return;} Заменить на: CKsAudPin::CKsAudPin (CKsAudFilter* pFilter, ULONG nId, HRESULT* phr ) : CKsPin(pFilter, nId, phr), m_pAudFilter(pFilter), m_pksDataFormat(NULL) {TRACE_ENTER(); HRESULT hr = *phr; if (SUCCEEDED(hr)) {hr = m_listDataRange.Initialize(1); if (FAILED(hr)) DebugPrintf(TRACE_ERROR,TEXT("Failed to Initialize m_listDataRange"));} if (SUCCEEDED(hr)) {hr = m_listNodes.Initialize(1); if (FAILED(hr)) DebugPrintf(TRACE_ERROR,TEXT("Failed to Initialize m_listNodes"));} // create a KSPIN_CONNECT structure to describe a waveformatex pin if (SUCCEEDED(hr)) {m_cbPinCreateSize = sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT); m_pksPinCreate = (PKSPIN_CONNECT)new BYTE[m_cbPinCreateSize]; if (!m_pksPinCreate) {DebugPrintf(TRACE_ERROR,TEXT("Failed to allocate m_pksPinCreate")); hr = E_OUTOFMEMORY;}} if (SUCCEEDED(hr)) {m_pksPinCreate->Interface.Set = KSINTERFACESETID_Standard; m_pksPinCreate->Interface.Id = KSINTERFACE_STANDARD_STREAMING; m_pksPinCreate->Interface.Flags = 0; m_pksPinCreate->Medium.Set = KSMEDIUMSETID_Standard; m_pksPinCreate->Medium.Id = KSMEDIUM_TYPE_ANYINSTANCE; m_pksPinCreate->Medium.Flags = 0; m_pksPinCreate->PinId = nId; m_pksPinCreate->PinToHandle = NULL; m_pksPinCreate->Priority.PriorityClass = KSPRIORITY_NORMAL; m_pksPinCreate->Priority.PrioritySubClass = 1; // point m_pksDataFormat to just after the pConnect struct PKSDATAFORMAT pksDataFormat = (PKSDATAFORMAT)(m_pksPinCreate + 1); // set up format for KSDATAFORMAT pksDataFormat->FormatSize = sizeof(KSDATAFORMAT); pksDataFormat->Flags = 0; pksDataFormat->SampleSize = 0; pksDataFormat->Reserved = 0; pksDataFormat->MajorFormat = KSDATAFORMAT_TYPE_MUSIC; pksDataFormat->SubFormat = KSDATAFORMAT_SUBTYPE_MIDI; pksDataFormat->Specifier = KSDATAFORMAT_SPECIFIER_NONE; m_pksDataFormat = pksDataFormat;} // Initialize the Pin; if (SUCCEEDED(hr)) {hr = CKsAudPin::Init();} TRACE_LEAVE_HRESULT(hr); *phr = hr; return;} В файле audpin.h Что заменить: TList<KSDATARANGE_AUDIO> m_listDataRange; Заменить на: TList<KSDATARANGE_MUSIC> m_listDataRange; Что заменить: BOOL IsFormatSupported(const WAVEFORMATEX* pwfx); Заменить на: BOOL IsFormatSupported(); Что заменить: KSDATAFORMAT_WAVEFORMATEX* m_pksDataFormatWfx; Заменить на: KSDATAFORMAT * m_pksDataFormat;
Страницы: 1, 2, 3, 4, 5, 6, 7
|