Enumerating Synchronization Playlists
[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 example code creates a function that fills a ListView control with playlists. Synchronization playlists appear first. Synchronization playlists for the currently selected device are marked with a check mark and are sorted in synchronization priority order. All other playlists are unchecked.
The ListView control was configured for single selection. The order of playlists in the ListView control determines their synchronization priority. The checked state of an individual playlist determines whether it is a synchronization playlist for the currently selected device.
The parameter lPSIndex specifies the partnership index for the currently selected portable device.
STDMETHODIMP CSyncSettings::ShowPlaylists(long lPSIndex)
{
HRESULT hr = S_OK;
ATLASSERT(m_pMainDlg);
CComPtr<IWMPMediaCollection> spMediaCollection;
CComPtr<IWMPPlaylist> spPlaylist; // Contains a playlist of all playlists.
long lSyncItemCount= 0; // Count of items selected for synchronization.
ListView_DeleteAllItems(m_hPlView);
m_spPlaylist.Release();
if(lPSIndex == 0)
{
return S_OK;
}
HCURSOR hCursor = LoadCursor(NULL, IDC_WAIT);
HCURSOR hCursorOld = SetCursor(hCursor);
if(SUCCEEDED(hr))
{
// Retrieve a pointer to IWMPMediaCollection.
hr = m_spPlayer->get_mediaCollection(&spMediaCollection);
}
if(SUCCEEDED(hr) && spMediaCollection)
{
// Retrieve a playlist filled with IWMPMedia items.
// Each IWMPMedia represents an individual playlist
// in the library.
hr = spMediaCollection->getByAttribute(CComBSTR("MediaType"), CComBSTR("playlist"), &spPlaylist);
}
if(SUCCEEDED(hr) && spPlaylist)
{
// Get the sync attribute name for the current device.
CComBSTR bstrAttribute(g_szSyncAttributeNames[lPSIndex]);
// Sort the playlist.
// lSyncItemCount is the count of synchronization playlists.
hr = SortPlaylist(spPlaylist, bstrAttribute, &lSyncItemCount);
if(SUCCEEDED(hr))
{
m_spPlaylist = spPlaylist; // Cache the playlist.
long lCount = 0;
spPlaylist->get_count(&lCount);
// Fill the ListView control.
for(long i = 0; i < lCount; i++)
{
CComPtr<IWMPMedia> spMedia;
CComBSTR bstrPlaylistName;
CComBSTR bstrVal; // Value of the SyncXX attribute.
// Retrieve a playlist.
hr = spPlaylist->get_item(i, &spMedia);
if(SUCCEEDED(hr) && spMedia)
{
// Get the name.
hr = spMedia->get_name(&bstrPlaylistName);
}
if(SUCCEEDED(hr) && spMedia)
{
// Get the SyncXX attribute value.
hr = spMedia->getItemInfo(bstrAttribute, &bstrVal);
}
if(SUCCEEDED(hr) && bstrPlaylistName.Length())
{
// Insert the item in the ListView control.
LVITEM lvI;
ZeroMemory(&lvI, sizeof(LVITEM));
lvI.mask = LVIF_TEXT;
lvI.lParam = _wtol(bstrVal);
lvI.iItem = ListView_GetItemCount(m_hPlView);
lvI.pszText = "";
ListView_InsertItem(m_hPlView, &lvI);
// If this is a sync playlist, mark the check box.
if(i < lSyncItemCount)
{
ListView_SetCheckState(m_hPlView, i, TRUE);
}
// Display the playlist name.
lvI.iSubItem = 1;
lvI.pszText = COLE2T(bstrPlaylistName);
ListView_SetItem(m_hPlView, &lvI);
}
}
}
}
SetCursor(hCursorOld);
return hr;
}
For the implementation of the SortPlaylist function, see Sorting Playlists by Synchronization Priority.
Related topics