Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
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;
	}
}