Share via


Ripping mithilfe von IWMPPlayerServices::setTaskPane

[Das dieser Seite zugeordnete Feature Windows Medienwiedergabe SDK ist ein Legacyfeature. Es wurde von MediaPlayer abgelöst. MediaPlayer wurde für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, mediaPlayer anstelle von Windows Medienwiedergabe SDK für neuen Code zu verwenden. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Hinweis

In diesem Abschnitt wird eine Funktion der ActiveX-Steuerelemente der Windows Medienwiedergabe 9-Serie und Windows Medienwiedergabe 10 beschrieben. Es wird empfohlen, die IWMPCdromRip-Schnittstelle mit höheren Versionen zu verwenden. Siehe IWMPCdromRip-Schnittstelle.

 

Sie können das Steuerelement Windows Medienwiedergabe Serie 9 oder höher verwenden, um CD-Titel auf den Computer des Benutzers zu kopieren. Dieser Prozess wird als Ripping bezeichnet. Dazu müssen Sie das Windows Medienwiedergabe-Steuerelement in den Remotemodus einbetten. Weitere Informationen zum Remotemodus finden Sie unter Remoting des Windows Medienwiedergabe Control.

Um den Rippingprozess zu starten, rufen Sie IWMPPlayerServices::setTaskPane auf, und übergeben Sie copyFromCD? AutoCopy:id-Wert für den bstrTaskPane-Parameter , wobei id der Index des CD-Laufwerks ist, aus dem kopiert werden soll. Dieser Index entspricht dem Index eines Cdrom-Objekts in der IWMPCdromCollection-Schnittstelle oder dem CdromMediaChange-Ereignis .

Der folgende Beispielcode ist eine Funktion, die den Prozess zum Rippen einer CD aus dem CD-Laufwerk startet, das durch Index null identifiziert wird. Die Funktion verwendet die folgende Membervariable:

CComPtr<IWMPPlayer4>  m_spPlayer;  // Smart pointer to IWMPPlayer4.

Der folgende Code zeigt den Text der Funktion:

HRESULT CMyApp::StartRip()
{
    CComPtr<IWMPPlayerApplication>  spPlayerApp;
    CComPtr<IWMPPlayerServices>     spPlayerServices;
    CComBSTR bstrParam;  // Contains the parameter string.

    ATLASSERT(m_spPlayer.p);

    HRESULT hr = m_spPlayer->QueryInterface(&spPlayerServices);

    if(SUCCEEDED(hr))
    {
        // Create the parameter string.
        hr = bstrParam.Append(_T("CopyFromCD?AutoCopy:0"));
    }

    if(SUCCEEDED(hr))
    {
        // Rip the CD in drive 0.
        hr = spPlayerServices->setTaskPane(bstrParam);
    }

    return hr;
}

Anzeigen des Status für den Benutzer

Beim Kopieren von einer CD können Sie eine Zeichenfolge abrufen, die status Informationen zum Kopiervorgang enthält. Dazu müssen Sie zunächst eine Wiedergabeliste abrufen, die Medienelemente enthält, die die CD-Titel darstellen, indem Sie IWMPCdrom::get_playlist aufrufen. Wie im vorherigen Beispiel funktioniert der folgende Beispielcode mit CD-Laufwerkindex null. Die abgerufene Wiedergabeliste wird in der folgenden Membervariablen gespeichert:

CComPtr<IWMPPlaylist>  m_spCDPlaylist;

Der folgende Code zeigt den Text der Funktion:

HRESULT CMyApp::GetCDPlaylist()
{
    HRESULT hr = S_OK;

    // Release any existing playlist instance.
    m_spCDPlaylist.Release();

    CComPtr<IWMPCdromCollection> spCDDrives;
    CComPtr<IWMPCdrom>  spDrive;
    long lCount = 0;  // Count of CD drives.

    ATLASSERT(m_spPlayer);

    hr = m_spPlayer->get_cdromCollection(&spCDDrives);

    // Test to make sure there is at least one drive.
    if(SUCCEEDED(hr))
    {
        hr = spCDDrives->get_count(&lCount);
    }

    if(SUCCEEDED(hr) && lCount < 1)
    {
        MessageBox(_T("No CD drive detected"), 
                   _T("CD Rip Error"), MB_OK);
        hr = NS_E_CD_READ_ERROR;
    }

    if(SUCCEEDED(hr))
    {
        // Retrieve the first drive.
        hr = spCDDrives->item(0, &spDrive);
    }
    
    if(SUCCEEDED(hr))
    {
        // Get the playlist.
        hr = spDrive->get_playlist(&m_spCDPlaylist);
    }
   
    return hr;
}

Behandeln Sie als Nächstes das Ereignis IWMPEvents::MediaChange . Dieses Ereignis tritt auf, wenn eine CD-Spur gerissen wird. Der an den Ereignishandler übergebene IDispatch-Zeiger verweist auf die IWMPMedia-Schnittstelle für die CD-Spur. Rufen Sie QueryInterface über IDispatch auf, um den Zeiger auf IWMPMedia abzurufen.

Um zu erkennen, welcher CD-Titel gerissen wird, vergleichen Sie den IWMPMedia-Zeiger vom Ereignis mit den Medienelementen in der CD-Wiedergabeliste, indem Sie IWMPMedia::get_isIdentical aufrufen.

Rufen Sie IWMPMedia::getItemInfo auf, und übergeben Sie die Zeichenfolge "Status" als Elementnamen. Status ist ein temporäres Attribut, das von Windows Medienwiedergabe für Medienelemente festgelegt wird, während sie von cd gerissen werden. Es ist nicht in der Bibliothek verfügbar.

Der folgende Beispielcode zeigt einen MediaChange-Ereignishandler .

void CMyApp::MediaChange(IDispatch * Item)
{
    // Test whether the CD playlist exists.
    if(!m_spCDPlaylist)
    {
        return;
    }

    // Declare and initialize variables.
    CComPtr<IWMPMedia> spMedia;
    HRESULT hr = S_OK;
    VARIANT_BOOL vbIdentical = VARIANT_FALSE;
    CComBSTR bstrVal;
    CComBSTR bstrName;
    long lCount = 0;  

    // Create the attribute value string.
    hr = bstrName.Append(_T("Status"));

    if(SUCCEEDED(hr))
    { 
        // Retrieve the IWMPMedia pointer from IDispatch.
        hr = Item->QueryInterface(__uuidof(IWMPMedia),(void**)&spMedia);
    }

    if(SUCCEEDED(hr))
    {
        // Get the value of the Status attribute.
        hr = spMedia->getItemInfo(bstrName, &bstrVal);
    }

    if(SUCCEEDED(hr))
    {
        // If the attribute is empty, set a failure code
        // to simply exit the function.
        if(bstrVal.Length() == 0)
        {
            hr = E_PENDING;
        }
    }
      
    if(SUCCEEDED(hr))
    {
        // Retrieve the count of items in the CD playlist.
        hr = m_spCDPlaylist->get_count(&lCount);
    }

    if(lCount < 1)
    {
        // Exit if the playlist is empty.
        hr = E_PENDING;
    }    

    if(SUCCEEDED(hr) && spMedia)
    {
        // Iterate through the playlist.
        // Compare the media item that raised the event
        // to each CD track. This detects which track
        // has a new status.
        for(long i = 0; i < lCount; i++)
        {
            CComPtr<IWMPMedia> spTrack;

            // Retrieve the CD track as a media object.
            hr = m_spCDPlaylist->get_item(i, &spTrack);

            if(SUCCEEDED(hr))
            {
                // Do the comparison.
                hr = spMedia->get_isIdentical(spTrack, &vbIdentical);
            }

            if(SUCCEEDED(hr) && VARIANT_TRUE == vbIdentical)
            {
                 // spTrack represents a track with changed status.
                 // bstrVal contains a status string. For example:
                 // "Ripping (10%)"
                 //
                 // TODO: Retrieve metadata about the track, and then
                 // display the status to the user.
            }
        }
    }

    return;
}

IWMPCdrom-Schnittstelle

IWMPCdromCollection-Schnittstelle

IWMPEvents-Schnittstelle

IWMPMedia-Schnittstelle

IWMPPlayerServices-Schnittstelle

IWMPPlaylist-Schnittstelle

Leitfaden zur Playersteuerung

Kopieren mithilfe der IWMPCdromRip-Schnittstelle