Enumerating the Media Items
[The feature associated with this page, Windows Media Player SDK, is a legacy feature. It has been superseded by MediaPlayer. MediaPlayer has been optimized for Windows 10 and Windows 11. Microsoft strongly recommends that new code use MediaPlayer instead of Windows Media Player SDK, when possible. Microsoft suggests that existing code that uses the legacy APIs be rewritten to use the new APIs if possible.]
The following code displays the media items contained in an individual playlist. This code runs when the user clicks a playlist in the ListView control identified by IDC_PLVIEW.
STDMETHODIMP CSyncSettings::ShowMedia(long lIndex)
{
ATLASSERT(m_pMainDlg != NULL);
ATLASSERT(m_spPlaylist.p);
HRESULT hr = S_OK;
long lCount = 0; // Count of items in the playlist.
LVITEM lvI;
ZeroMemory(&lvI, sizeof(LVITEM));
lvI.mask = LVIF_TEXT;
CComPtr<IWMPMedia> spPlaylist; // Playlist the user selected.
CComBSTR bstrSourceURL; // The URL of a digital media file.
CComPtr<IWMPPlaylist> spNewPlaylist; // Temporary playlist that contains media items.
ULONG ulOnDevice = 0;
ULONG ulDidNotFit = 0;
HCURSOR hCursor = LoadCursor(NULL, IDC_WAIT);
HCURSOR hCursorOld = SetCursor(hCursor);
ListView_DeleteAllItems(m_hMediaView);
// Retrieve the playlist the user selected.
hr = m_spPlaylist->get_item(lIndex, &spPlaylist);
if(SUCCEEDED(hr) && spPlaylist)
{
// Retrieve the source URL (the path).
hr = spPlaylist->get_sourceURL(&bstrSourceURL);
}
if(SUCCEEDED(hr) && bstrSourceURL.Length())
{
CComPtr<IWMPCore3> spCore3;
m_spPlayer.QueryInterface(&spCore3);
// Create a temporary IWMPPlaylist object from the IWMPMedia
// playlist object.
hr = spCore3->newPlaylist(CComBSTR("Temp"), bstrSourceURL, &spNewPlaylist);
}
if(SUCCEEDED(hr) && spNewPlaylist)
{
hr = spNewPlaylist->get_count(&lCount);
}
// Walk the playlist.
if(SUCCEEDED(hr) && lCount > 0)
{
for(long i = 0; i < lCount; i++)
{
CComPtr<IWMPMedia> spMedia;
CComBSTR bstrMediaName;
CComBSTR bstrOnDevice = "???";
CComBSTR bstrFit = "???";
hr = spNewPlaylist->get_item(i, &spMedia);
if(SUCCEEDED(hr) && spMedia)
{
// Get the name.
hr = spMedia->get_name(&bstrMediaName);
}
if(SUCCEEDED(hr) && bstrMediaName.Length())
{
// Show the media name.
lvI.iItem = ListView_GetItemCount(m_hMediaView);
lvI.iSubItem = 0;
lvI.pszText = COLE2T(bstrMediaName);
ListView_InsertItem(m_hMediaView, &lvI);
// Retrieve the synchronization state information for
// the digital media file.
hr = GetPartnershipSyncState(spMedia, m_lCurrentPSIndex, &ulOnDevice, &ulDidNotFit);
}
if(SUCCEEDED(hr))
{
// Test whether the media is on the device.
if(ulOnDevice == 1)
{
bstrOnDevice = "Yes";
bstrFit = "Yes";
}
else
{
bstrOnDevice = "No";
// 1 means media did not fit,
// 0 means other reason for failure.
bstrFit = ulDidNotFit ? "No" : "Yes";
}
}
ListView_SetItemText(m_hMediaView, lvI.iItem, 1, COLE2T(bstrOnDevice));
ListView_SetItemText(m_hMediaView, lvI.iItem, 2, COLE2T(bstrFit));
}
}
if(SUCCEEDED(hr) && lCount == 0)
{
// Empty playlist.
lvI.iItem = ListView_GetItemCount(m_hMediaView);
lvI.iSubItem = 0;
lvI.pszText = COLE2T(CComBSTR("No items to display."));
ListView_InsertItem(m_hMediaView, &lvI);
}
SetCursor(hCursorOld);
return hr;
}
For the implementation of the GetPartnershipSyncState function, see Determining Playlist Synchronization State.
Related topics