Sortieren von Wiedergabelisten nach Synchronisierungspriorität
Der folgende Code führt eine einfache Art von Wiedergabelisten aus. Sie können sehen, wie diese Funktion im Beispielcode unter Auflisten von Synchronisierungswiedergabelisten verwendet wird. Die Funktion verwendet die folgenden Parameter:
- pPlaylist. Der Zeiger auf die zu Windows Media Player zu sortierende Wiedergabeliste. Die Medienelemente in der Wiedergabeliste müssen auf andere Wiedergabelisten verweisen, nicht auf einzelne digitale Mediendateien.
- bstrSyncAttribute. Ein BSTR mit dem Namen des Synchronisierungspartnerschaftsattributs für das aktuelle Gerät ("Sync01", "Sync02" und so weiter).
- plSelected. Zeiger auf eine long-Variable, die die Anzahl der Synchronisierungswiedergabelisten empfängt.
Die Funktion überprüft das Synchronisierungspartnerschaftsattribut für jedes Medienelement (das eine Wiedergabeliste darstellt) in der Wiedergabeliste, die von pPlaylist angegeben wird. Wenn das Attribut einen Wert ungleich 0 (null) hat, verschiebt der Code das Medienelement an den Anfang der Wiedergabeliste und fügt es in prioritätsgeordneter Reihenfolge ein.
Wenn Sie fertig sind, gibt die Funktion die Anzahl der Medienelemente (Synchronisierungswiedergabelisten) zurück, die einen Wert ungleich 0 (null) für das Synchronisierungspartnerschaftattribut hatten.
STDMETHODIMP CSyncSettings::SortPlaylist(IWMPPlaylist *pPlaylist, BSTR bstrSyncAttribute, long *plSelected)
{
HRESULT hr = S_OK;
long lSyncItemCount = 0;
ATLASSERT (pPlaylist);
ATLASSERT (plSelected);
// Local copies of the parameters.
CComPtr<IWMPPlaylist> spPlaylist(pPlaylist);
CComBSTR bstrAttribute(bstrSyncAttribute);
ATLASSERT (bstrAttribute.Length());
// Get the count of playlist media items.
long lCount = 0;
spPlaylist->get_count(&lCount);
// Walk the playlist.
for(long i = 0; i < lCount; i++)
{
CComPtr<IWMPMedia> spMedia;
CComBSTR bstrVal;
long lPriority = 0;
hr = spPlaylist->get_item(i, &spMedia);
if(SUCCEEDED(hr) && spMedia)
{
// Get the sync priority value as a string.
hr = spMedia->getItemInfo(bstrAttribute, &bstrVal);
}
if(SUCCEEDED(hr) && spMedia)
{
// Convert sync priority to a long number.
lPriority = _wtol(bstrVal);
}
// Sort the playlist.
// Only move the current item if it has a
// sync priority value.
if(lPriority > 0)
{
lSyncItemCount++;
// Walk down the list and insert the item
// in ascending order.
for(long j = 0; j < lCount; j++)
{
CComPtr<IWMPMedia> spMediaCompare;
CComBSTR bstrValCompare;
long lPriorityTest = 0;
hr = spPlaylist->get_item(j, &spMediaCompare);
if(SUCCEEDED(hr) && spMediaCompare.p)
{
hr = spMediaCompare->getItemInfo(bstrAttribute, &bstrValCompare);
}
if(SUCCEEDED(hr) && spMediaCompare.p)
{
lPriorityTest = _wtol(bstrValCompare);
if(lPriority <= lPriorityTest ||
0 == lPriorityTest)
{
hr = spPlaylist->moveItem(i, j);
break;
}
}
} // for j
} // if(lPriority > 0)
} // for i
// Return the sync item count.
*plSelected = lSyncItemCount;
return hr;
}