Compartilhar via


Rasgando usando IWMPPlayerServices::setTaskPane

[O recurso associado a esta página, Reprodutor Multimídia do Windows SDK, é um recurso herdado. Foi substituído pelo MediaPlayer. O MediaPlayer foi otimizado para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use o MediaPlayer em vez de Reprodutor Multimídia do Windows SDK, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Observação

Esta seção documenta um recurso dos controles Reprodutor Multimídia do Windows Série 9 e Reprodutor Multimídia do Windows 10 ActiveX. É recomendável que você use a interface IWMPCdromRip com versões posteriores. Consulte Interface IWMPCdromRip.

 

Você pode usar o controle Reprodutor Multimídia do Windows Série 9 ou posterior para copiar faixas de CD para o computador do usuário. Esse processo é chamado de rasgar. Para fazer isso, você deve inserir o controle Reprodutor Multimídia do Windows no modo remoto. Para obter mais informações sobre o modo remoto, consulte Comunicação remota do controle de Reprodutor Multimídia do Windows.

Para iniciar o processo de rasgação, chame IWMPPlayerServices::setTaskPane, passando o CopyFromCD? AutoCopy:id value for the bstrTaskPane parameter, where id is the index of the CD drive from which to copy. Esse índice corresponde ao índice de um objeto Cdrom na interface IWMPCdromCollection ou ao evento CdromMediaChange .

O código de exemplo a seguir é uma função que inicia o processo de extrair um CD da unidade de CD identificada pelo índice zero. A função usa a seguinte variável de membro:

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

O código a seguir mostra o corpo da função:

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;
}

Exibindo o status para o usuário

Ao copiar de um CD, você pode recuperar uma cadeia de caracteres que contém status informações sobre a operação de cópia. Para fazer isso, primeiro você deve recuperar uma playlist que contém itens de mídia que representam as faixas de CD chamando IWMPCdrom::get_playlist. Como no exemplo anterior, o código de exemplo a seguir funciona com o índice de unidade de CD zero. Ele armazena a playlist recuperada na seguinte variável de membro:

CComPtr<IWMPPlaylist>  m_spCDPlaylist;

O código a seguir mostra o corpo da função:

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;
}

Em seguida, manipule o evento IWMPEvents::MediaChange . Esse evento ocorre quando uma faixa de CD está sendo rasgada. O ponteiro IDispatch passado para o manipulador de eventos aponta para a interface IWMPMedia para a faixa de CD. Chame QueryInterface por meio de IDispatch para recuperar o ponteiro para IWMPMedia.

Para detectar qual faixa de CD está sendo rasgada, compare o ponteiro IWMPMedia do evento com os itens de mídia na playlist de CD chamando IWMPMedia::get_isIdentical.

Chame IWMPMedia::getItemInfo, passando a cadeia de caracteres "Status" como o nome do item. Status é um atributo temporário definido por Reprodutor Multimídia do Windows em itens de mídia enquanto eles estão sendo extraídos do CD; ele não está disponível na biblioteca.

O código de exemplo a seguir mostra um manipulador de eventos MediaChange .

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 Interface

IWMPCdromCollection Interface

IWMPEvents Interface

IWMPMedia Interface

IWMPPlayerServices Interface

IWMPPlaylist Interface

Guia de controle do player

Rasgando usando a interface IWMPCdromRip