WASAPI та PlayPcmWin розбір

Передмова

Як відомо, вихід Windows Vista ознаменувався смертю звукової підсистеми DirectSound та поява нової підсистеми Windows Audio Session Application Programming Interface (WASAPI). Я вже писав про це неодноразово – у статті Організація якісного виведення звуку та Як повернути якісний звук у Windows 7.

Особисто для мене такий поворот подій виявився повною несподіванкою. Як я вже писав, в результаті Windows практично повністю втратила доступ до апаратних можливостей звукових карт, а побітовий висновок аудіо багато в чому ускладнився. Звичайно, треба відзначити універсальність, простоту та зручність нової підсистеми - зворотна сумісність зі старими програмами, що використовують Wave Out, DS), підтримка будь-якої частоти дискретизації аж до 192 кГц, регулювання гучності для кожної програми. Але, хоча прогрес IT і рухається у напрямку спрощення, «простіше» — далеко не завжди означає «краще». Скажімо, спочатку невідомо було, яким чином працює ресемплінг WASAPI. Крім того, у 16-бітному режимі мікшер вносив якісь незрозумілі шуми, що скорочують динамічний діапазон на десяток децибелів.

Але не все так погано. У WASAPI було закладено багато цікавих можливостей, що дозволяють виконувати тонке налаштування виводу, у тому числі якості ресемплювання, латентності та ін. Благо, зараз розробники ПЗ серйозно взялися за реалізацію цих можливостей.

Обладнання та ПЗ

200?'200px':''+(this.scrollHeight+5)+'px');" Intel Core i3 2.93 ГГц, ASUS P7H55-V, 4 ГБ DDR3, Creative X-Fi Xtreme Gamer

Microsoft Windows 7 Ultimate SP1 x64

PlayPcmWin x64 4.0.62 RightMark Audio Analyzer 6.3.0 Adobe Audition CS6 Sony Sound Forge 10.0c

PlayPcmWin

Отже, нещодавно я розмістив на сайті аудіофільський плеєр PlayPcmWin, який і призначений для виведення через WASAPI, і, як наслідок, найбільш повно реалізує всі можливості цього API. Тож почнемо знайомство із системою за допомогою цього плеєра.

Програма має дві версії – 32- та 64-бітну. 64-бітна версія дозволяє зменшити навантаження на процесор, а також використовувати більше оперативної пам'яті. Ми, як ви вже зрозуміли, використовуватимемо PlayPcmWin x64.

Давайте запустимо програму та розглянемо елементи її головного вікна.

00000000

Програма має простий та зручний інтерфейс. Зліва розташовується плейлист з підтримкою drag'n'drop, нижче - елементи керування плейлистом та відтворенням. Праворуч ми бачимо базові налаштування, вибір звукового пристрою, а також інформаційні елементи - лог і кнопку отримання списку форматів, що підтримуються пристроєм.

Для початку розповім про налаштування (WASAPI Settings). НалаштуванняOperation modeвідповідає за вибір режиму відтворення - звичайний (shared) або монопольний (exclusive). Другий режим доступний лише тоді, коли у налаштуваннях звукового пристрою Windows увімкнено дозвіл його використання. У випадку звичайного режиму, в якому працює більшість програм, написаних для Windows Vista і нових ОС, Windows Audio Service може використовувати всі свої обробники, зображені на блок-схемі зліва:

розбір

API— Application Programming Interface

APO— Audio Processing Object

CPT— Cross Process Transport

KST— Kernel Streaming Transport

Цей режим має деякі налаштування, але про це пізніше. Що стосується режиму монопольного - в ньому відключаються всі ці обробники і звук надходить безпосередньо на KernelStreaming Transport. Так як у даного транспорту тільки один вхідний і один вихідний потік (змішування потоків з різних додатків відбувається в Mixer APO), підключення безпосередньо до KST веде блокування всіх інших звуків.

НалаштуванняData feed modeвідповідає за режим передачі даних, а точніше режим роботи програмного буфера. Режим Event driven є технічно досконалішим, ніж Timer driven (іноді називається Push), має знижене навантаження на процесор і, як наслідок, клацання (та інші артефакти) в цьому режимі менш ймовірні. Однак, є пристрої, що відмовляються працювати в Event driven mode, тоді необхідно використовувати режим Timer. Варто зазначити, що обидва режими дозволяють отримати відтворення побіта, і до якості звучання це відношення не має.

Параметр латентності дозволяє встановити розмір вихідного буфера WASAPI. Це також не має відношення до якості відтворення і впливає лише на відгук (швидкість реакції) на зміни параметрів відтворення. Однак надто низький розмір буфера неминуче призведе до клацань при відтворенні.

Далі є дуже цікава функція List supported formats. Після натискання кнопки у полі лога з'являється текстова таблиця такого виду:

200?'200px':''+(this.scrollHeight+5)+'px');"> PlayPcmWin 4.0.62.0 64bit

DeviceFriendlyName=Динаміки (Creative SB X-Fi)

44kHz i16V16 48kHz i16V16 88kHz i16V16 96kHz i16V16176kHz i16V16192kHz i16V16352kHz i16V16384kHz i16V16

OK 00000000 OK 00000000 OK 00000000 OK 00000000 OK 00000000 OK 00000000 NA 88890008 NA 88890008

44kHz i24V24 48kHz i24V24 88kHz i24V24 96kHz i24V24176kHz i24V24192kHz i24V24352kHz i24V24384kHz i24V24

NA 88890008 NA 88890008 NA 88890008 NA 88890008NA 88890008 NA 88890008 NA 88890008 NA 88890008

44kHz i32V24 48kHz i32V24 88kHz i32V24 96kHz i32V24176kHz i32V24192kHz i32V24352kHz i32V24384kHz i32V24

OK 00000000 OK 00000000 OK 00000000 OK 00000000 OK 00000000 OK 00000000 NA 88890008 NA 88890008

44kHz i32V32 48kHz i32V32 88kHz i32V32 96kHz i32V32176kHz i32V32192kHz i32V32352kHz i32V32384kHz i32V32

OK 00000000 OK 00000000 OK 00000000 OK 00000000 OK 00000000 OK 00000000 NA 88890008 NA 88890008

44kHz f32V32 48kHz f32V32 88kHz f32V32 96kHz f32V32176kHz f32V32192kHz f32V32352kHz f32V32384kHz f32V32

NA 88890008 NA 88890008 NA 88890008 NA 88890008 NA 88890008 NA 88890008 NA 88890008 NA 88890008

Це інформація про формати аудіо даних, що підтримує драйвер звукової карти, тобто. фактично, це формати, які можуть надходити на Kernel Streaming Transport. Як видно з таблиці, пристрій підтримує стандартні семплрейти від 44.1 до 192 кГц. Що ж до розрядності, умовні позначення тут такі: ixxVyy означає «xx біт із фіксованою точкою (integer), їх yy бітів значущі». Тобто. i16V16 - звичайний 16-бітний формат з фіксованою точкою, f32V32 - 32-бітний з плаваючою точкою. i32V24 означає, що до 24-бітових даних додали 8 порожніх бітів та отримали 32-бітні. Цей прийом використовується у випадку, коли картка не підтримує на вхід 24-бітові дані, наприклад наша карта X-Fi.

Таким чином, карта підтримує стандартні формати з фіксованою точкою, крім 24-бітного.

розширені налаштування

Після натискання кнопкиDetailed settingsми потрапляємо в розширені налаштування програми.

wasapi

Перша група налаштувань відноситься до монопольного режиму. Тут можна вибрати формат даних,якому буде виводитися звук. Тут слід встановити параметр у режим автовибору, або вибрати підтримуваний режим з найбільшою розрядністю (див. таблицю). Також тут можна включити дизеринг (мабуть, з нойз шейпінгом), який буде виконуватися при зниженні розрядності (наприклад, якщо джерело 24-біт, а висновок - 16-біт). До речі, погляньмо на якість дизерингу.

88890008
NS on

00000000
NS off

Дуже дивно — ніякого дизерингу, а тим більше нойз шейпінгу тут не видно. Програма лише додає якийсь дивний шум. Ймовірно, це баг - я вже повідомив про цю дивина розробнику.

Додано: за словами розробника, обробка все ж таки виконується і називається це формуванням шуму першого порядку (first order noise shaping). Тобто. додатковий шум запис не вводиться, а вже наявний шум квантування за допомогою спеціального алгоритму, що включає зворотний зв'язок, витісняється в область високих частот. Розробник також стверджує, що як дизер можуть запросто виступати природні шуми мікрофона, присутні на більшості записів. Тобто. такий алгоритм дає переважно кращі результати на живих, не синтетичних записах.

Додано: у весрії 4.0.63 була додана можливість використовувати комбінації dither та noise shaping.

Далі ми маємо налаштування загального режиму WASAPI. Ми можемо керувати якістю ресемплера (resampler MFT або Audio resampler DSP), що входить у Windows Audio Service. Як написано в документації Microsoft, якщо програма не виконує управління якістю ресемплера, встановлюється значення за замовчуванням - 30. Давайте порівняємо якість ресемплінгу 44.1-96 кГц з якістю 1, 30 і 60 (максимум).

розбір
Q=1

playpcmwin
Q = 30

playpcmwin
Q = 60

На слух мінімальна якість має значні спотворення, режими якості 30 та 60 на слух практично однаково прийнятні. До речі, цікаво, що управління якістю ресемплінгу було запроваджено лише у Windows 7.

Тут є налаштування автоматичного масштабування сигналу по амплітуді до 98% від максимуму, що запобігає втручанню лімітера Windows (інакше він компресуватиме сигнал).

Щодо режиму Shared — з особливостями його роботи ви можете ознайомитись у огляді Windows Media Player.

І остання група налаштувань, яка нас цікавить Playback thread settings, тобто. налаштування потоку відтворення. Тут ми стикаємося з новацією під назвою MMCSS (Multimedia Class Scheduler Service). Ця служба займається розподілом процесорних ресурсів між процесами, що відповідають за виконання завдання реального часу – запису, відтворення (рендерингу). Увімкнувши цю функцію (DwmEnableMMCSS(True) і встановивши тип завдання в Pro Audio, ми тим самим встановимо для програвання максимальний пріоритет доступу до ЦП, що дозволить ще більше зменшити латентність (розмір буфера). Таким чином, встановлення режиму Pro Audio зменшує ймовірність спустошення буфера (що є причиною клацань), проте цей режим менш ефективний з точки зору ефективності енергоспоживання.

Загалом, це все, налаштування щодо якості відтворення. Варто також додати, що перед відтворенням плейлиста програма виконує декодування та необхідну обробку (наприклад, дизеринг або масштабування амплітуди), поміщаючи результат в оперативній пам'яті комп'ютера у вибраному форматі (для монопольного режиму використовується режимвибраний у налаштуваннях, для загального – вихідний формат). Ось приклад лога після запуску та включення треку:

Тривалість треку – близько 6 хвилин. Після запуску програма споживала 70 Мб ОЗУ, після включення треку – 212 Мб.

88890008

Як ви можете побачити на скріншоті. мені вдалося здійснити виведення аудіо у форматі i32V24 із затримкою всього 3 мс. При цьому звукові артефакти не спостерігалися

Що найцікавіше - в режимі Shared програма виконує ресемплювання засобами алгоритму resampler MFT, а потім отримує потік назад, поміщаючи вже ресемпілроване аудіо в ОЗУ (тобто ресемплінг виконується не на льоту). Ось лог:

Після початку твору програма споживала близько 340 Мб ОЗП.

PlayPcmWin підтримує формати WAV, AIFF, FLAC, також має підтримку CUEsheet.

Ця програма, поза всякими сумнівами, цікавить лише ентузіастів. PlayPcmWin наочно демонструє нам усі можливості Windows Audio Service, які виявились досить широкими. Незважаючи на відсутність повного доступу до апаратних ресурсів (як DirectSound), WASAPI має широкі можливості програмної обробки звуку, а також дозволяє організувати виведення звуку з низькою затримкою.