// This method will fill the source stream with data from a buffer void FillSourceFromMemory(UCHAR *pData, long lSize, IltmmPlay *pPlay) { IltmmMemory *pMemSource = NULL; // try to get the play source stream object HRESULT hr = pPlay->get_SourceStream((IUnknown**)&pMemSource); if(FAILED(hr) || pMemSource == NULL) return; // set our desired buffer size pMemSource->put_BufferSize(lSize); SAFEARRAY sa; VARIANT var; // setup the safe array memset(&sa, 0, sizeof(sa)); sa.cbElements = sizeof(unsigned char); sa.cDims = 1; sa.fFeatures = (FADF_AUTO | FADF_FIXEDSIZE); sa.pvData = pData; sa.rgsabound[0].cElements = lSize; // associate the safe array with our variant VariantInit(&var); V_VT(&var) = (VT_ARRAY | VT_UI1); V_ARRAY(&var) = &sa; // set the source data to the variant safe array data pMemSource->SetData(0, lSize, var); // release the source object pMemSource->Release(); }