Неясності з phonon

Неясності з Phonon
Від труднощів збірки перейдемо до неясним місцях у використанні Phonon. Phonon підтримує ті мультимедійні формати, які підтримуються бекенд. У випадку з Xine або Gstreamer це залежить від встановлених плагінів Xine і Gstreamer, а для Direct Show - від встановлених кодеків-фільтрів Direct Show. Наприклад, для того щоб ваша програма під Windows «розуміла» Ogg Vorbis і FLAC, треба поставити в систему кодек з https://xiph.org/dshow. Як програмно дізнатися, чи підтримується запущеним у користувача бекенд якийсь файл? Питання просте, а відповідь на нього - не те щоб складний, але клопіткий.

Статична функція Phonon :: BackendCapabilities :: available MimeTypes () повертає QStringList, наповнений назвами MIME-типів, які підтримуються бекенд. А вже як цим списком розпорядитися - залежить лише від вас. Опишу один із способів. Завдання стоїть так: дізнатися, якого MIME-типу відповідає файл, і подивитися, чи входить цей MIME-тип в список підтримуваних типів. Щоб дізнатися найперше, треба, по-перше, отримати розширення з шляху до файлу. Пропоную для цього наступну, що передбачає деякі прикрі несподіванки, функцію:
QString file _ get _ ext (const QString Sfile _ name) if (file _ name.isNull () 

Якщо ім`я файлу - пусте або ж не містить розширення, повертається порожній рядок, інакше - наведене до нижнього регістра розширення, без точки.

Тепер знадобиться таблиця відповідностей розширень файлів і MIME-типів. Є щодо стандартна таблиця від FreeDesktop - пакет з нею зазвичай називається shared-mime-info і знаходиться в / usr / share / mime (дивіться файли globs *, та й взагалі корисно подивитися вміст цих каталогів). Ця таблиця використовується в GNOME і KDE. Додатки до неї зберігаються в $ HOME / .local / share / mime. Таблиця велика, але аж ніяк не повна. До того ж, в Windows її немає. Якщо ви пишете набір інструментів, написаний програму, доведеться шукати універсальне рішення. А воно - на поверхні: треба створити власну базу MIME-відповідностей і включити її в свою програму як ресурс. Звичайний ini-подібний файл, який завантажуєте в hash-таблицю, де ключами служать розширення файлів, а значеннями - MIME-типи.

Це можна зробити за допомогою наступного коду. Спочатку напишемо допоміжну функцію, завантажує файл в екземпляр QString:
QString qstring_load (const QString SfileName, const QString Scharset) QFile file (fileName) -if (! File.open (QFile:: ReadOnly 

Тепер - саму функцію читання в хеш-таблицю:
QHash hash _ load _ keyval (const QString Sfname) {QHash result-if (! File _ exists (fname)) return result-QStringList l = qstring_load (fname, "cp1251"). Split ( "n") - foreach (QString s, l) {QStringList sl = s.split ( "=") - if (sl.size () gt; 1) result.insertMulti (sl [0], sl [1]) -} return result-}

І нарешті - приклад використання. Оголосимо хеш-таблицю mime_types і прочитаємо в неї таблицю з ресурсу:



QHash mime _types = hash _load _keyval ( ": / res / mime.txt") -

Неясності з Phonon

У ресурсі mime.txt у нас такі рядки:
aiff = audio / aiffmod = audio / modaif = audio / x-aiffaiff = audio / x-aiffm4a = audio / x-m4awav = audio / x-basic [і так далі]

Щоб отримати «відомі» в цій таблиці MIME-типи, треба звернутися до функції QHash :: values () без параметра. Щоб отримати MIME-типи, відповідні якомусь розширенню файлу, треба викликати її ж, але з параметром:
// Отримуємо розширення файлу QString ext = file _ get _ ext (fname) - if (ext.isEmpty ()) return;
// Отримуємо список MIME-типів для розширення ext QList mts = mime _ types.values (ext) - if (mime _ types.count () == 0) return;

Отриманий список буде потрібно переглянути в циклі і перевірити, чи будь-якої елемент списку в список типів, підтримуваних бекенд. Якщо так, то файл підтримується на відтворення.

Ось ще одна тонкість, яка погано документована. Йдеться про вибір вихідного звукового пристрою. Іноді не хочеться використовувати загальносистемні установки (вони налаштовуються в центрі керування KDE, в розділі налаштувань Phonon). Phonon вміє видавати список доступних вихідних пристроїв:



QList audioOutputDevices = Phonon :: BackendCapabilities :: availableAudioOutputDevices () -

З ним мало що можна зробити корисного - хіба що отримати назви:
QStringList sl-foreach (Phonon :: AudioOutputDevice ad, audioOutputDevices) sl lt; lt; ad.name () -

щоб потім наповнити ними випадає і додати до нього вибір пристрою:
// Створюємо комбо-боксQComboBox * cb_ outdevs = new QComboBox (this) - // Наповнюємо його елементами списку cb _ outdevs-gt; addItems (sl) - // Читаємо з QSettings збережений в налаштуваннях індекс - // номер пристрою зі списку, і робимо його поточним в комбо-боксі cb _ outdevs-gt; setCurrentIndex (settings-gt; value ( "output _dev", 0) .toInt ()) - // Зв`язуємо комбо-бокс з слотом перемикання: connect (cb _ outdevs , SIGNAL (currentIndexChanged (int)), this, SLOT (cb _ outdevs _ currentIndexChanged (int))) -

Ось і сам слот:
void MainWindow :: cb _outdevs _currentIndexChanged (int index) {// Пишемо індекс пристрою в налаштування: settings-gt; setValue ( "output _ dev", index) - // Робимо пристрій поточним, використовуючи індексaudioOutput-gt; setOutputDevice (Phonon: : BackendCapabilities :: availableAudioOutputDevices () [index]) -}

Саме ж вихідний пристрій Phonon, з урахуванням можливості вибору пристрою, створюємо приблизно так:
audioOutput = new Phonon :: AudioOutput (this);
int idx = settings-gt; value ( "output _ dev", 0) .toInt () - audioOutput-gt; setOutputDevice (Phonon :: BackendCapabilities :: availableAudioOutputDevices () [idx]) -

Підведу підсумок. Від списку вихідних пристроїв потрібні дві речі: їх імена і індекси. Імена відображаються користувачеві, а індекси потрібні, щоб задавати потрібний пристрій виведення. Коли користувач вибирає назву пристрою, записуємо його індекс в налаштування і потім задаємо це пристрій через функцію Phonon :: AudioOutput :: setOutputDevice (). Те ж проробляється при завантаженні програми відразу після створення екземпляра класу Phonon :: AudioOutput.


ІНШЕ

Бесіди про qt. 5: phonon фото

Бесіди про qt. 5: phonon

Відео: Qt Tutorials For BeginnersПролог Одного разу я йшов по ринку і побачив людей, схожих на індусів. Вони продавали…

Ultimate ++: theide фото

Ultimate ++: theide

Відео: N ++: Sigma Structure Symphony (SU-B-17-04) All Gold При кожному запуску TheIDE відкривається вікно вибору…

Ultimate ++: перша програма фото

Ultimate ++: перша програма

Відео: Уроки C # (C sharp) | # 3 - Перша програма на C # Перейдемо до реального прикладу. Напишемо просту марну…

Труднощі з phonon фото

Труднощі з phonon

Відео: TAG: новонароджені - ТРУДНОЩІ ПЕРШОГО МІСЯЦЯ! MNOGOMAMA Я не хочу повторювати документацію і приводити якісь…

Бесіди про qt: qsettings і xml фото

Бесіди про qt: qsettings і xml

Клас QSettings служить Qt-програмістам вірою і правдою, коли потрібно зберегти або завантажити будь-які налаштування…

» » Неясності з phonon