У попередніх статтях я розповів, як вдалося запустити CarPlay на Raspberry Pi, досягти стабільного підключення телефона та реалізувати сенсорне керування.
Але залишалася ще одна важлива частина будь-якої автомобільної мультимедійної системи — звук.
На перший погляд завдання здається простим: отримати аудіодані від Carlinkit і передати їх на звуковий вихід. Однак на практиці саме робота зі звуком виявилася однією з найбільш трудомістких частин розробки CaRadio.
Особливо коли справа дійшла до навігаційних підказок.
Регулювання гучності, для якого не знайшлося місця
Почну з досить простої, але несподіваної проблеми.
У початковій конструкції магнітоли мені фізично не було куди встановити регулятор гучності.
Спочатку я взагалі регулював звук за допомогою маленької бездротової клавіатури. Для експериментів такий варіант цілком підходив, але для постійного використання в автомобілі був незручним.
У результаті я додав другий екран, на якому розмістив кнопки регулювання гучності.
Там само передбачив можливість перезавантажити систему, якщо щось піде не так.
Вийшло не зовсім те рішення, яке я уявляв на початку розробки, зате воно дозволило обійти обмеження конструкції без серйозної переробки корпусу магнітоли.
Один PCM5102 для всього звуку
Для виведення звуку в CaRadio я використовував ЦАП PCM5102.
Наскільки я зрозумів під час вивчення FastCarPlay, у початковій реалізації звук був розділений між двома пристроями.
У мене ж був лише один PCM5102, через який необхідно було відтворювати все: музику, навігаційні підказки та інші звуки CarPlay.
Річ у тім, що CarPlay передає різні типи звуку окремими потоками.
Це зручно з погляду самої системи, але створює додаткове завдання, коли все необхідно вивести через один фізичний аудіовихід.
Тому довелося реалізувати програмне мікшування.
У результаті кілька аудіопотоків об'єднувалися та передавалися на один ЦАП.
Але, як з'ясувалося, саме мікшування було далеко не найскладнішою частиною роботи.
Коли навігатор починає говорити
Уявімо звичайну ситуацію.
В автомобілі грає музика, водій наближається до перехрестя, і навігатор повідомляє, куди потрібно повернути.
У нормальній мультимедійній системі музика на час підказки стає тихішою, голос навігатора добре чути, а після завершення підказки попередня гучність відновлюється.
Саме такої поведінки я хотів досягти в CaRadio.
Проблема полягала в тому, що в мене не було всієї інформації, необхідної для коректного керування гучністю.
Або Carlinkit не передавав відповідні дані в доступній частині протоколу, або розробникам, які займалися його зворотною розробкою, на той момент не вдалося визначити, як ці дані отримати.
Я не можу стверджувати, який із варіантів був правильним.
Зокрема, залишалося незрозумілим, яку гучність слід встановлювати для музики та голосових підказок, а також у який саме момент потрібно приглушувати музику й повертати її до попереднього рівня.
Довелося шукати власний спосіб керування.
Таймер замість точної інформації від CarPlay
Основою рішення стало відстеження надходження аудіопотоку навігаційних підказок.
Коли починала надходити голосова підказка, CaRadio могла приглушити музику, щоб голос навігатора не губився на її тлі.
Але виникала інша проблема: як визначити, що підказка справді закінчилася?
Якщо відновлювати гучність музики одразу після припинення надходження чергових аудіоданих, можна отримати різкий перехід або навіть обрізати закінчення фрази.
Навігаційні підказки не завжди надходять як один безперервний фрагмент звуку. Між окремими частинами можуть виникати невеликі паузи.
Тому я додав затримку перед відновленням гучності музики.
Після припинення надходження потоку підказки запускався таймер приблизно на 300–500 мілісекунд.
Якщо за цей час надходили нові аудіодані, відновлення гучності відкладалося.
Так вдалося зменшити ймовірність різких перемикань, клацань та обрізання останніх слів навігаційної підказки.
Рішення вийшло не ідеальним, але на практиці виявилося достатньо ефективним.
Найбільш незручне налагодження
Напевно, саме цей етап розробки запам'ятався мені найбільше.
Річ у тім, що навігаційні підказки відтворювалися не завжди й не за будь-яких умов.
Просто запустити магнітолу на столі та перевірити звук було недостатньо.
Для повноцінної перевірки доводилося встановлювати CaRadio в автомобіль і вирушати в поїздку із запущеною навігацією.
Якщо під час руху виявлялася проблема, я намагався запам'ятати, за яких обставин вона виникла.
Після поїздки доводилося знову знімати магнітолу, нести її додому, змінювати код і повторювати перевірку.
І так багато разів.
Особливо неприємним було те, що деякі помилки проявлялися лише в певних ситуаціях. Можна було проїхати частину маршруту без жодної проблеми, а потім почути неправильно приглушену музику або обрізану підказку.
Після чергової зміни доводилося знову перевіряти поведінку системи в реальних умовах.
Такий спосіб налагодження складно назвати зручним, але іншого достатньо надійного способу відтворити всі ці ситуації в мене тоді не було.
Не ідеально, зате працює
Поступово вдалося підібрати поведінку, за якої музика та навігаційні підказки перестали заважати одна одній.
Звичайно, я не можу назвати цю реалізацію ідеальною.
Залишилися деякі недоліки, і за бажання алгоритм керування гучністю можна було б доопрацьовувати далі.
Але головне — система почала працювати стабільно.
Музика відтворюється, навігаційні підказки чути, а після їх завершення гучність відновлюється.
Для мене це був той результат, якого я прагнув.
Адже CaRadio створювалася не як демонстраційний проект, який достатньо один раз запустити на столі.
Я хотів користуватися власною магнітолою щодня.
Перша версія CaRadio
На цьому, мабуть, можна завершити розповідь про розробку першої версії CaRadio.
За час роботи над нею довелося вирішити чимало завдань: від запуску CarPlay через Carlinkit до обробки сенсорного введення, керування живленням і відтворення звуку.
Деякі рішення вийшли досить простими, інші потребували численних експериментів.
Були й компроміси, продиктовані конструкцією магнітоли, доступним обладнанням і часом, який я міг приділяти проекту.
Але в підсумку з набору компонентів і програмних експериментів вийшла працююча автомобільна мультимедійна система.
Не без недоліків, не з усіма функціями, які хотілося б реалізувати, але достатньо стабільна для повсякденного використання.
І це, мабуть, головне досягнення першої версії CaRadio.
На цьому історія проекту не закінчується. Просто далі починається вже інший етап його розвитку.