Esempio n. 1
0
static HRESULT CreateAAFFile(
    aafWChar * pFileName,
    aafUID_constref fileKind,
    testRawStorageType_t rawStorageType,
    aafProductIdentification_constref productID)
{
    IAAFFile *					pFile = NULL;
    bool bFileOpen = false;
    IAAFHeader *				pHeader = NULL;
    IAAFDictionary*  pDictionary = NULL;
    IAAFContainerDef*  pContainer = NULL;
    IAAFSourceMob	*pSourceMob = NULL;
    IAAFMob			*pMob = NULL;
    IAAFEssenceDescriptor *edesc = NULL;
    IAAFFileDescriptor *pFileDesc = NULL;
    IAAFFileDescriptor2 *pFileDesc2 = NULL;

    HRESULT						hr = S_OK;

    try
    {
        // Remove the previous test file if any.
        RemoveTestFile(pFileName);


        // Create the file
        checkResult(CreateTestFile( pFileName, fileKind, rawStorageType, productID, &pFile ));
        bFileOpen = true;

        // We can't really do anthing in AAF without the header.
        checkResult(pFile->GetHeader(&pHeader));

        // Get the AAF Dictionary so that we can create valid AAF objects.
        checkResult(pHeader->GetDictionary(&pDictionary));
        CAAFBuiltinDefs defs (pDictionary);

        //Make the first mob
        long			test;
        aafRational_t	audioRate = { 44100, 1 };

        // Create a Mob
        checkResult(defs.cdSourceMob()->
                    CreateInstance(IID_IAAFSourceMob,
                                   (IUnknown **)&pSourceMob));

        checkResult(pSourceMob->QueryInterface (IID_IAAFMob, (void **)&pMob));

        checkResult(pMob->SetMobID(TEST_MobID));
        checkResult(pMob->SetName(L"FileDescriptorTest"));

        // Add some slots
        for(test = 0; test < 2; test++)
        {
            checkResult(pSourceMob->AddNilReference (test+1, 0, defs.ddkAAFSound(), audioRate));
        }

        // Create a concrete subclass of FileDescriptor
        checkResult(defs.cdAIFCDescriptor()->
                    CreateInstance(IID_IAAFEssenceDescriptor,
                                   (IUnknown **)&edesc));

        IAAFAIFCDescriptor*			pAIFCDesc = NULL;
        checkResult(edesc->QueryInterface (IID_IAAFAIFCDescriptor, (void **)&pAIFCDesc));
        checkResult(pAIFCDesc->SetSummary (5, (unsigned char*)"TEST"));
        pAIFCDesc->Release();
        pAIFCDesc = NULL;

        checkResult(edesc->QueryInterface(IID_IAAFFileDescriptor, (void **) &pFileDesc));
        checkResult(pFileDesc->SetSampleRate (checkSampleRate));
        checkResult(pDictionary->LookupContainerDef(checkContainer, &pContainer));
        checkResult(pFileDesc->SetContainerFormat (pContainer));
        pContainer->Release();
        pContainer = NULL;

        checkResult(pFileDesc->SetLength (checkLength));
        checkResult(pFileDesc->QueryInterface(IID_IAAFFileDescriptor2, (void **)&pFileDesc2));
        checkResult(pFileDesc2->SetLinkedSlotID (checkLinkedSlotID));
//		checkResult(pFileDesc->SetIsInContainer (kAAFTrue));

        checkResult(pSourceMob->SetEssenceDescriptor (edesc));

        checkResult(pHeader->AddMob(pMob));

    }
    catch (HRESULT& rResult)
    {
        hr = rResult;
    }

    if (pFileDesc)
        pFileDesc->Release();

    if (pFileDesc2)
        pFileDesc2->Release();

    if (edesc)
        edesc->Release();

    if (pMob)
        pMob->Release();

    if (pSourceMob)
        pSourceMob->Release();

    if (pDictionary)
        pDictionary->Release();

    if (pHeader)
        pHeader->Release();

    if (pFile)
    {
        if (bFileOpen)
        {
            pFile->Save();
            pFile->Close();
        }
        pFile->Release();
    }

    return hr;
}