HRESULT FindConnectedPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin) { *ppPin = nullptr; HRESULT hr; ComPtr<IEnumPins> pEnum; ComPtr<IPin> pPin; hr = pFilter->EnumPins(&pEnum); if (FAILED(hr)) { return hr; } BOOL bFound = FALSE; while (pEnum->Next(1, &pPin, nullptr) == S_OK) { BOOL bIsConnected; hr = IsPinConnected(pPin, &bIsConnected); if (SUCCEEDED(hr)) { if (bIsConnected) { hr = IsPinDirection(pPin, PinDir, &bFound); } } if (FAILED(hr)) { break; } if (bFound) { *ppPin = pPin; pPin->AddRef(); break; } } if (!bFound) { hr = VFW_E_NOT_FOUND; } return hr; }
QString UrlFromFileArgs(IInspectable *args) { ComPtr<IFileActivatedEventArgs> fileArgs; COM_ENSURE(args->QueryInterface(fileArgs.GetAddressOf()), QString()); ComPtr<IVectorView<IStorageItem*>> files; COM_ENSURE(fileArgs->get_Files(&files), QString()); ComPtr<IStorageItem> item; COM_ENSURE(files->GetAt(0, &item), QString()); HString path; COM_ENSURE(item->get_Path(path.GetAddressOf()), QString()); quint32 pathLen; const wchar_t *pathStr = path.GetRawBuffer(&pathLen); const QString filePath = QString::fromWCharArray(pathStr, pathLen); qDebug() << "file path: " << filePath; item->AddRef(); //ensure we can access it later. TODO: how to release? return QString::fromLatin1("winrt:@%1:%2").arg((qint64)(qptrdiff)item.Get()).arg(filePath); }
bool ff::BufferCache::BorrowAndMapBuffer(size_t nBytes, ID3D11Buffer **ppBuffer, void **ppMapped) { assertRetVal(ppBuffer, false); size_t nBuffer = GetBufferIndex(nBytes); size_t nLargestBuffer = _countof(_buffers) - 1; // Try to reuse a cached buffer for (ComPtr<ID3D11Buffer> *pCur = _buffers[nBuffer].GetFirst(); pCur; pCur = _buffers[nBuffer].GetNext(*pCur)) { size_t nCurSize = GetBufferSize(*pCur); if (nCurSize >= nBytes) { if (ppMapped) { // Try to lock the buffer D3D11_MAPPED_SUBRESOURCE map; assertRetVal(SUCCEEDED(_device->GetContext()->Map(*pCur, 0, D3D11_MAP_WRITE_DISCARD, 0, &map)), false); *ppMapped = map.pData; } *ppBuffer = pCur->AddRef(); _buffers[nBuffer].Delete(*pCur); return true; } } // See if one of the large buffers should be thrown away // (to make room for a larger one) if (nBuffer == nLargestBuffer && _allocated[nLargestBuffer] >= GetMaxBufferCount() && _buffers[nLargestBuffer].Size()) { // Throw away one of the "large" buffers, it isn't large enough for (ComPtr<ID3D11Buffer> *pCur = _buffers[nLargestBuffer].GetFirst(); pCur; pCur = _buffers[nLargestBuffer].GetNext(*pCur)) { size_t nCurSize = GetBufferSize(*pCur); if (nCurSize < nBytes) { _buffers[nLargestBuffer].Delete(*pCur); _allocated[nLargestBuffer]--; break; } } } // Add a few empty buffers for later if (nBuffer != nLargestBuffer && !_allocated[nBuffer]) { for (size_t i = 0; i < GetMaxBufferCount() - 1; i++) { ComPtr<ID3D11Buffer> pBuffer; assertRetVal(CreateBuffer(GetAllocationSize(nBytes), &pBuffer), false); _buffers[nBuffer].Insert(pBuffer); _allocated[nBuffer]++; } } // Can't reuse an existing buffer, so create a new one { ComPtr<ID3D11Buffer> pBuffer; assertRetVal(CreateBuffer(GetAllocationSize(nBytes), &pBuffer), false); if (ppMapped) { D3D11_MAPPED_SUBRESOURCE map; assertRetVal(SUCCEEDED(_device->GetContext()->Map(pBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &map)), false); *ppMapped = map.pData; } *ppBuffer = pBuffer.Detach(); _allocated[nBuffer]++; return true; } }