Сортировка списков воспроизведения по приоритету синхронизации

[Функция, связанная с этой страницей, Медиаплеер Windows SDK, является устаревшей функцией. Он был заменен MediaPlayer. MediaPlayer оптимизирован для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует по возможности использовать MediaPlayer вместо пакета SDK для Медиаплеер Windows. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

В следующем коде выполняется простой вид списков воспроизведения. Вы можете увидеть, как эта функция используется в примере кода в разделе Перечисление списков воспроизведения синхронизации. Функция принимает следующие параметры:

  • pPlaylist. Указатель на Медиаплеер Windows список воспроизведения для сортировки. Элементы мультимедиа в списке воспроизведения должны указывать на другие списки воспроизведения, а не на отдельные цифровые файлы мультимедиа.
  • bstrSyncAttribute. Строка BSTR, содержащая имя атрибута партнерства синхронизации для текущего устройства ("Sync01", "Sync02" и т. д.).
  • plSelected. Указатель на переменную long , которая получает количество списков воспроизведения синхронизации.

Функция проверяет атрибут партнерства синхронизации для каждого элемента мультимедиа (представляющего список воспроизведения) в списке воспроизведения, указанном pPlaylist. Если атрибут имеет ненулевое значение, код перемещает элемент мультимедиа в начало списка воспроизведения и вставляет его в порядке приоритета.

По завершении функция возвращает количество элементов мультимедиа (списков воспроизведения синхронизации), которые имели ненулевое значение для атрибута партнерства синхронизации.

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

IWMPMedia::getItemInfo

IWMPPlaylist::get_item

IWMPPlaylist::moveItem

Управление списками воспроизведения синхронизации

Атрибуты синхронизации