Коли мова йде про high-end мультимедійний проект з великою кількістю математичних обчислень в реальному часі та зручним інтерфейсом користувача, то вибір технології реалізації часто зводиться до С++ платформи. Сьогодні з допомогою С та С++ створюють найшвидші програми (Детальніше тут). С++ зручний ще й тим, що з його допомогою можна легше інтегруватися з апаратними рішеннями для обробки аудіо та відео.
Нашою метою є створення мультимедіа програми з багатим інтерфейсом користувача, яка працюватиме під MS Windows® та Mac OS X. При цьому обидві копії мають бути зібрані з одного вихідного коду.
Щоб ускладнити задачу, уявімо, що мультимедіа програма вже існує, протягом півтора десятка років випущено …надцять версій програми, програма є добре впізнавана, є лідером на ринку і має свою велику аудиторію шанувальників на платформі MS Windows. Звичайно, вона написана на MS Visual C++ з використанням MFC (Microsoft Foundation Classes) і містить більше мільйона стрічок вихідного коду.
Архітектура такої програми виглядає приблизно так:
Багато бібліотек вже вміють працювати під різними ОС, або вони можуть бути відносно легко замінені на кросплатформені відповідники. Якщо прийняти той факт, що алгоритми обробки мультимедіа даних здебільшого становлять чисті математичні обчислення, і їх портування не повинно становити особливих труднощів, то основна увага цієї статті та проекту з портування мультимедіа програми з MS Windows® на Mac OS X буде зосереджена на розв’язанні прив’язки програми до графічної бібліотеки MFC та виклику системних функцій Win API.
На ринку програмного забезпечення немає жодної бібліотеки, яка б могла адекватно замінити бібліотеку MFC і працювати під інші операційні системи, відмінні від MS Windows®.
Серед розглянутих бібліотек інтерфейсу користувача (GTK, wxWidgets та інші) Qt платформа виявилась найбільш зрілою і близькою до задуму проекту. Бібліотека класів та С++ компілятор Qt пропонують надійне рішення для створення кросплатформених професійних мультимедіа програм. Але, можливо, згодом з’являться кращі бібліотеки. Тому нова архітектура повинна передбачати можливість роботи з іншими графічними бібліотеками і С++ компіляторами.
Враховуючи багаточисельні відмінності Qt від MFC та Win API в малюванні елементів графічного інтерфейсу (контроли, віджети), виконанні операцій з графікою, системі циркуляції та обробки повідомлень, тощо, нова архітектура повинна абстрагуватись від них і приховувати ці відмінності та інші деталі реалізації від інших компонентів програми, які, в свою чергу, не повинні залежати від обраного компілятора, графічної бібліотеки та операційної системи.
Нова архітектура буде виглядати наступним чином:

Бібліотека «Abstraction Lib» буде містити оголошення всіх базових типів, з якими будуть працювати інші бібліотеки («Adapted Custom OS-dependent Libs», «MFC counterpart»), що забезпечить їхню незалежність від С++ компілятора та супровідної бібліотеки класів – в даному випадку Qt. «Abstraction Lib» також буде містити конвертори з Qt класів у власні базові класи і навпаки, а ще буде забезпечувати уніфіковану схему виконання операцій та обробки повідомлень (event flow).
У такій архітектурі бібліотеки «Adapted Custom OS-dependent Libs» та «MFC counterpart» будуть працювати однаково під MS Windows® та Mac OS X і не будуть залежати від обраного С++ компілятора та базової бібліотеки класів. Всі інші компоненти системи залишаться без змін.
Висновки. Безумовно існують інші погляди на портування існуючих програм під інші ОС. У даному підході взято до уваги існуючі технології та набуті компетенції, великий обсяг прикладної логіки програми, яка має залишитися без змін, а також вимога випуску наступної комерційної версії програми у короткий термін.
Михайло Фльорко
©Intellias