Цифровой аудиотракт: апсемплинг и апскейлинг, WASAPI, ASIO и внешний мастер клок для USB-аудио

ТEКСТ: Комментарии (27)
74.77 дБ
Цифровой аудиотракт: апсемплинг и апскейлинг, WASAPI, ASIO и внешний мастер клок для USB-аудио

Пара слов о составе, работе и оптимизации цифрового аудиотракта с использованием компьютера и USB. В принципе, тема скучная и букв получилось много, так что если осилить сложно — сразу переходите к выводам.

Basic

Звуковой сигнал, в общем случае, кодируется последовательностью значений амплитуды сигнала, измеренных через равные промежутки времени. Единичное значение амплитуды называют сэмплом, а время между двумя соседними измерениями — частотой дискретизации или частотой квантования. В подавляющем большинстве случаев сэмпл при передаче на аудиоустройство описывают знаковым целым числом — разрядности 16, 24 или 32 бита. Разрядность в 32 бита может быть использована для выравнивания буфера устройства по границе двойного слова, тогда семпл кодируется только первыми 24 битами, или же для полноразрядного кодирования. Первый вариант доступен в ASIO и WASAPI, второй только в WASAPI.

Максимально достижимое соотношение сигнал/шум определяется разрядностью сэмпла и вычисляется как 20log(2^q) где q — разрядность сэмпла.

16 бит — диапазон сэмпла [−32768, 32767], SNR 96.33 дБ
24 бит — диапазон сэмпла [−8388608, 8388607], SNR 144.49 дБ
32 бит — диапазон сэмпла [−2147483648, 2147483647] , SNR 192.66 дБ

Частоты дискретизации (количество сэмплов в секунду для одного канала) из-за взаимной кратности стоит выписать в два набора: {44100, 88200, 192000} и {48000, 96000}. Два набора частот приводят к тому, что аудиоустройству нужно два осциллятора для качественной синхронизации. Конечно, можно использовать и один с кратной частотой, например, как 88200, так и 96000 Гц, но это существенно повышает сложность исполнения точного тактового контура.

Вывод: качественное аудиоустройство должно иметь два осциллятора, один для работы с частотами {44100, 88200}, второй для {48000, 96000, 192000}.

DSP

При обработке цифрового сигнала (DSP — digital sound processing) сэмпл масштабируется как минимум к 64-битному числу с плавающей точкой (double64) в диапазоне от –1 до 1. Наиболее часто применяются преобразования upsampling/downsampling и upscale/downscale. Второе заключается в изменении разрядности сэмпла и в подавляющем большинстве реализаций сводится к простому масштабированию 64-битного double к желаемой битовой разрядности. Данное преобразование помимо масштабирования полезного сигнала делает точно такое же масштабирование и шума, поэтому upscale не меняет соотношение сигнал/шум исходного сигнала, а downscale дополнительно увеличивает долю шума за счет деградации разрядности полезного сигнала.

Upsampling/downsampling очень часто выполняется через решения полинома n-го порядка (как правило, кубического). Берется последовательность из K-сэмплов, и из них рассчитываются коэффициенты интерполирующего полинома, затем полученный полином решается для новых точек семплирования. В идеальном случае, согласно теореме Найквиста-Котельникова, upsampling может только сохранить разрешение исходного сигнала на новой частоте семплирования. В неидеальном случае возможно появления шума на высших гармониках. Интересно, что downsampling после upsampling вернет исходное значение сигнала, даже если после upsampling в нем появились искажения и шум.

В студиях используют алгоритмы, объединяющие upsampling и upscale в единый процесс для увеличения разрешения сигнала и его динамического диапазона. Эти алгоритмы достаточно «тяжелы» и не могут быть использованы при воспроизведении в реальном времени.

Еще один случай обработки DSP — это convolution (свертка), применимая для адаптации сигнала под акустические свойства комнаты. Здесь исходный сигнал разлагается на гармоники в ряд Фурье до n-го порядка. К сожалению, все быстрые алгоритмы как правило работают с амплитудой сигнала определенной частоты без учета фазы (которую еще очень непросто правильно измерить). Более того, быстрые алгоритмы не решают интеграл, а берут среднее значение в диапазоне. В результате вся коррекция сводится к параметрическому эквалайзеру. Простые полосные фильтры вносят фазовые искажения на частотах разделения, из-за этого параметры convolution нужно еще раз и еще раз подстраивать.

MQA на высоких гармониках, на мой взгляд, инкрементально кодирует первую производную (наклон) функции амплитуды сигнала. Зная частоту гармоник кодировки, простым разложением в ряд Фурье очень просто вытащить и восстановить поведение производной. А имея производную, можно уже делать upsampling не полиномами, а сплайнами со сглаживанием. Вот тогда, уже в реальном времени, можно делать upsampling и upscale с увеличением разрешения и динамического диапазона сигнала. Конечно, это не будет оригинальный Hi-Res, но уже кое-что.

Выводы: Upscale не улучшает соотношение сигнал/шум. Upsampling не улучшает разрешения сигнала. Upsampling имеет смысл для перехода от линейки 44100 к 48000, если осциллятор Вашего устройства лучше для 48000. Использование room correction требует итеративной настройки и, во многом, непредсказуемо.

Software player

Я ограничусь рассмотрением Windows-архитектуры, как наиболее доступной и наиболее оптимальной для создания цифрового транспорта. Windows предоставляет три варианта доступа к аудиоустройству: Kernel Streaming, Direct Sound, WASAPI. Плюс подавляющее большинство аудиоустройств поставляются с ASIO-драйвером. Из перечисленных способов только Direct Sound и ASIO являются полноценными аудиоинтерфейсами с возможностями DSP: upsampling/downsampling, upscale/downscale, управлением громкостью и микшированием. Кроме того, ASIO имеет возможность расширения аудиотракта за счет плагинов.

Kernel Streaming и WASAPI являются протоколами низкого уровня для управлений различными устройствами, в том числе и аудио. При этом тяжесть любой DSP-обработки сигнала ложится на программный плеер, использующий эти протоколы. Современные высококачественные программные плееры используют в работе WASAPI и/или ASIO, поскольку оба они предоставляют возможность асинхронной передачи аудиоданных из памяти компьютера в память аудиоустройства.

На всякий случай замечу, что память компьютера и память аудиоустройства — физически разные микросхемы. Программный плеер при работе имеет доступ только к памяти компьютера, где и формирует аудиоданные. Перезапись сформированных данных из одной памяти в другую осуществляется драйвером аудиоустройства.

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

Первый режим — «совместное использование» устройства, когда несколько процессов одновременно могут передавать данные устройству. Второй режим — «эксклюзивный», когда устройство блокируется для монопольного использования только одной программой (одним клиентом). ASIO работает исключительно в эксклюзивном режиме. С точки зрения воспроизведения разницы между WASAPI и ASIO не существует, кроме разве что возможности передачи по WASAPI полноразрядного 32-битного семпла (ASIO если и будет поддерживать такой режим, то все равно будет использовать только первые 24 бита из 32).

Как было отмечено выше, upscale не улучшает соотношение сигнал/шум и, поскольку полноразрядного 32 исходного файла я ни разу не встречал, то и здесь нет никакой разницы между WASAPI и ASIO. Тем не менее, я как программист и как слушатель предпочитаю WASAPI, естественно, в эксклюзивном режиме. Но это дело исключительно вкуса и личных симпатий.

Вывод: если Вы (как и я) воспроизводите аудиосигнал без DSP-обработки, то Вы можете использовать любой (*) программный плеер, поддерживающий WASAPI Exclusive и/или ASIO.

(*) смотри внимательно следующий раздел.

USB Audio

Начну с хорошей новости для Windows: начиная с релиза 1703 включен нативный драйвер USB Audio 2.0.

USB-аудио может работать в трех режимах: асинхронном, синхронном и адаптивным. При асинхронном режиме источник устанавливает значение клока и передает это значение вместе с буфером данных на аудиоустройство. Оно должно синхронизироваться по полученному клоку, обработать буфер, используя свой клок, и послать подтверждение источнику.

При синхронном режиме источник и аудиоустройство периодически синхронизируют свои клоки, а данные уже передаются без тайминга. При адаптивном режиме значения клока указывает аудиоустройство, а источник должен синхронизировать передачу данных.

Как видно, синхронный режим — самый требовательный, поскольку требует качественного клока как на источнике, так и на аудиоустройстве. Как правило, система работает в асинхронном режиме, а значит использует клок компьютера, качество которого не отвечает требованиям Hi-Fi и порождает огромный джиттер. Собственно говоря, это проблема породила кучу эзотерических плееров, которые перепрограммируют системный таймер, меряют скорость процессора, захватывают наибольший приоритет или вообще кладут компьютер в гибернативный режим.

Проблему это целиком не решает, но джитер снижается. Более приемлемый способ решения — это использование промежуточного буфера с реклоком. Это устройство не воспроизводит полученный буфер данных, а передает его дальше по цепочке, но уже с собственным временным кодом, полученным от собственного прецизионного осциллятора. Качество звука при этом существенно улучшается. На мой взгляд, из доступных буферов наиболее хорош Amanero, но можно использовать и XMOS с хорошим осциллятором.

Другое решение — это использование специализированного цифрового транспорта. В таком транспорте установлен качественный независимый выделенный осциллятор (как правило, два) для работы с частотами {44100, 88200, 192000} и для {48000, 96000}. Во всем остальном, это устройство намного примитивнее чем обычный компьютер. Как правило, при наличии опыта, очень качественный цифровой транспорт можно собрать самому на основе одноплатовых миникомпьютеров и софта Open Source. Поэтому цены на различные фирменные реализации цифрового транспорта меня реально шокируют.

Кардинальное и самое правильное решение для устранения джиттера и получения действительно правильного звука — это использование внешнего мастер клока. При этом и железо плеера, и ЦАП должны быть подключены к нему в слэйв-режиме. Именно такой подход используется в студиях звукозаписи.

Вывод: качество звука лучше улучшать не эзотерическим софтом, а железным цифровым буфером с реклоком. Самое правильное решение — это использование внешнего мастер клока

74.77 дБ +

Комментарии

#

Скажите, а зачем в цапах три осциллятора ставят? Или это другое?

- 50 дБ +
⇡ в ответ @Elias #

третий могут поставить для универсальности если семплирование идет с переменной частотой.

- 50 дБ +
#

уточните пожалуйста, о какого рода джиттере речь? Я так понимаю, речь идет о джиттере, наблюдаемом на аналоговых выходах?

- 50 дБ +
⇡ в ответ @YG #

джитер явление сугубо цифровое, не совпадение клока на источнике и приемнике. на аналоге будут уже последствия

- 50 дБ +
⇡ в ответ @slava_jazz #
джитер явление сугубо цифровое

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


Картинка с Si8660. Есть здесь джиттер? )

- 50 дБ +
⇡ в ответ @mexkb #

Вы глубже копайте и на квантовом уровне снова появится цифра в виде корпускул :))

я это к тому, что на уровне схем и алгоритмов это цифра а не аналог. носителем цифрового сигнала может быть что угодно, в том числе и электричество, свет и квантовый переход.

- 50 дБ +
⇡ в ответ @slava_jazz #
не совпадение клока на источнике и приемнике


хмм, ну допустим, в сд-плеере стоит дешевый кварц, плюс утечки питания, вот вам и джиттер - где здесь несовпадение источника и приемника?

и при этом его, джиттера, величину оценивают не на ножках ЦАПа, а на аналоговом выходе

вот что говорит теория, там более все сложно устроено и не всякий джиттер нами будет заметен https://www.ixbt.com/proaudio/...


- 50 дБ +
⇡ в ответ @YG #

Вы же пишете сами , дешевой кварц с проблемами питания, значит проблема фронта сигнала и тактование. можно еще и плохоэкранированный провод приплести, все равно, как говорится в Вашей ссылке " Говоря иначе, джиттер — это фазовая модуляция формы цифрового сигнала."


- 50 дБ +
#
Самое правильное решение — это использование внешнего мастер клока.

Порекомендуйте, пожалуйста конкретную, модельку. Как я понял устройство будет на Аманеро?

- 50 дБ +
⇡ в ответ @NoamZahid #

нет не на аманеро. внешний клок, за вменяемые деньги, это студийные решения. например https://www.lynxstudio.com/pro...

кстати на картинке к статье изображена https://www.lynxstudio.com/pro... я её использую в домашнем кинотеатре вместе с со старой aurora. и там и там есть in/out для мастер клок

- 53.01 дБ +
⇡ в ответ @NoamZahid #

если использовать мастер клок, то лучше всего вообще перейти на звуковую карту. с усб все будет завязано на драйвер, а с картой все честно по отдельному проводу.

- 50 дБ +
#

Ваш вывод: Upsampling не повышает разрешение сигнала. На сайте teac.com о SACD проигрывателе CD-3000 :

The CD-3000 also processes up-conversion to the incoming digital data via USB or Coaxial audio input, up to 192kHz. As a result

reproduced analog audio waveforms become much smoother.

Это разве не улучшение разрешения сигнала ?

- 50 дБ +
⇡ в ответ @avionics #

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

если коэффициентов будет мало, получите шум на высших гармониках.

- 50 дБ +
#

Парни помогите.

Установлен драйвер Аманеро USB 2.0, но после выключение компа и включения он ОТВАЛИВАЕТСЯ и приходится шнур Юсб выдёргивать и снова включать тогда появляется Аманеро-устройство звуковое. Иначе никак. Что делать кто знает? (Пробывал на виндоус 7 и 10 одинаково).

- 50 дБ +
⇡ в ответ @Aim_Rec #

Возможно срабатывает защита, ждать только когда обновят драйвера

- 50 дБ +
⇡ в ответ @Dmitrii8800 #

Врятли обновят только выпустили новый драйвер для Вин.10 не давно.

- 50 дБ +
⇡ в ответ @Aim_Rec #

Пробовали менять кабель?

- 50 дБ +
⇡ в ответ @Dmitrii8800 #

Надо попробовать, хотя я думаю дело всё же в компе надо с ноутбука попробовать взять у кого-нибудь..

- 50 дБ +
⇡ в ответ @Aim_Rec #

И всё же интересно почему отваливается Аманеро драйвер ?

- 50 дБ +
#
Во всем остальном, это устройство намного примитивнее чем обычный компьютер. Как правило, при наличии опыта, очень качественный цифровой транспорт можно собрать самому на основе одноплатовых миникомпьютеров и софта Open Source.

А пример готового решения или фирмы которые предлагают данные комплекты для сборки можно ?

- 50 дБ +
⇡ в ответ @Sabotender #

в качестве первой итерации с очень хорошим результатом можно начать с https://www.hifiberry.com/shop/bundles/hifiberry-digi-bundle/

берите digi+ pro, он уже с двумя осциляторами.

https://www.rasppishop.de/Boards

https://openelec.tv/

https://volumio.org/

- 53.01 дБ +
⇡ в ответ @slava_jazz #

Благодарю, буду изучать.

- 50 дБ +
#
в два набора: {44100, 88200, 192000} и {48000, 96000}

Вообще то {44100, 88200} и {48000, 96000, 192000}, потому что 192000 = 96000 х 2.

Оно должно синхронизироваться по полученному клоку, обработать буфер, используя свой клок, и послать подтверждение источнику.

В изохронном потоковом режиме, используемом для аудио, никакое подтверждение не посылается.

На мой взгляд, из доступных буферов наиболее хорош Amanero, но можно использовать и XMOS с хорошим осциллятором.

Вообще говоря, это не просто буферы, а контролеры USB-интерфейса, с множеством встроенных возможностей. Каждый из них поддерживает команды обмена с компьютером для организации потока данных. Иначе собственно ничего никуда не пойдет.

Собственно говоря, это проблема породила кучу эзотерических плееров, которые перепрограммируют системный таймер, меряют скорость процессора, захватывают наибольший приоритет или вообще кладут компьютер в гибернативный режим.

Я с трудом себе представляю схему приемника USB без специализированного контроллера с буфером, который будет работать в изохронном потоковом режиме. Кто и как тогда будет переупорядочивать данные, чтобы подать на вход ЦАП? Экзотический плеер? Так никакого асинхронного режима не получится, а все передавать отдельными словами данных по USB - задача неблагодарная.

Кардинальное и самое правильное решение для устранения джиттера и получения действительно правильного звука — это использование внешнего мастер клока.

О каком конкретно джиттере идет речь, если данные сначала обрабатываются в промежуточном буфере, потом попадают на ЦАП?

- 50 дБ +
⇡ в ответ @JaroslavS #
Вообще то {44100, 88200} и {48000, 96000, 192000}, потому что 192000 = 96000 х 2.

да конечно. спасибо, я ошибся.


В изохронном потоковом режиме, используемом для аудио, никакое подтверждение не посылается.

подтверждается. https://www.usb.org/document-library/usb-audio-devices-rev-30-and-adopters-agreement

вот выжимка: https://www.silabs.com/documents/public/white-papers/usb-audio-simplified.pdf


это не просто буферы, а контролеры USB-интерфейса

естественно.


Я с трудом себе представляю схему приемника USB без специализированного контроллера с буфером, который будет работать в изохронном потоковом режиме. Кто и как тогда будет переупорядочивать данные, чтобы подать на вход ЦАП?

данные никто не переупорядочивает. буффер обмена содержит n сэмплов и начало буфера тактуется внутреним клоком источника. для компютера это клок постоянно "плавает". это дрейф и пытаются устранить софтверные плееры приоритетами, гибернацией и собственым програмным клоком. приемник проигрывет буфер внутренним клоком синхронизируясь по такту начала буфера.

сначала обрабатываются в промежуточном буфере, потом попадают на ЦАП?

стадартный буфер приемника ничего не обрабатывает, это просто память. цап работает в реальном времени и получает данные от контроллера усб по внутреннему клоку. погрешность процессии внутреннего клока и ошибки тактовки начала буфера приводят к джитеру на ножках цапа



- 50 дБ +
⇡ в ответ @slava_jazz #
вот выжимка:

Это не подтверждение. Читаем, где асинхронный режим:

This feedback mechanism accommodates source/sink clock mismatch without requiring the sink device to implement PLL hardware to synchronize with the host clock

(Этот механизм обратной связи учитывает несоответствие тактового сигнала источника / приемника, не требуя от устройства-приемника реализовать оборудование PLL для синхронизации с тактовой частотой хоста)

Если выявлено несоответствие частоты приемника и передатчика, приемник формирует сигнал несоответствия для автоподстройки передатчика (Under or Over Flow Feedback на рисунке).

данные никто не переупорядочивает.
стадартный буфер приемника ничего не обрабатывает, это просто память. цап работает в реальном времени и получает данные от контроллера усб по внутреннему клоку. погрешность процессии внутреннего клока и ошибки тактовки начала буфера приводят к джитеру на ножках цапа

Вам стоит почитать про формат подробнее, хотя бы в приведенном вами наборе информации документ UNIVERSAL SERIAL BUS DEVICE CLASS DEFINITION FOR AUDIO DATA FORMATS, начиная с п. 2:

If multiple physical audio channels are formatted into a single audio channel cluster, then samples at time x of subsequent channels are first contained into audio subslots. These audio subslots are then interleaved, according to the cluster channel ordering as described in the main USB Audio Specification, and then grouped into an audio slot. The audio samples, taken at time x+1, are interleaved in the same fashion to generate the next audio slot and so on. The notion of physical channels is explicitly preserved during transmission. A typical example of Type I formats is the standard PCM audio data. The following figure illustrates the concept.

(Если несколько физических аудиоканалов отформатированы в одном кластере аудиоканалов, то выборки в момент времени x последующих каналов сначала содержатся в аудио подслотах. Эти звуковые подслоты затем чередуются в соответствии с порядком каналов кластера, как описано в основной спецификации USB Audio, и затем группируются в аудиослот. Аудио сэмплы, взятые в момент времени x + 1, чередуются таким же образом, чтобы генерировать следующий аудио-слот и так далее. Понятие физических каналов явно сохраняется во время передачи. Типичным примером форматов типа I являются стандартные аудиоданные PCM. Следующий рисунок иллюстрирует концепцию.)


The basic structure used to represent audio data is the audio subslot. An audio subslot holds a single audio sample. An audio subslot always contains an integer number of bytes.

This specification limits the possible audio subslot sizes (bSubslotSize) to 1, 2, 3, 4, or 8 bytes per audio subslot. An audio sample is represented using a number of bits (bBitResolution) less than or equal to the total number of bits available in the audio subslot, i.e. bBitResolution  bSubslotSize*8.

An audio slot consists of a collection of audio subslots, each containing an audio sample of a different physical audio channel, taken at the same moment in time. The number of audio subslots in an audio slot equals the number of logical audio channels in the audio channel cluster. The ordering of the audio subslots in the audio slot obeys the rules set forth in the USB Audio Specification. All audio subslots shall have the same audio subslot size.

(Базовой структурой, используемой для представления аудиоданных, является аудиослот. Аудио подслот содержит один аудиосэмпл.

Аудио подслот всегда содержит целое число байтов.Эта спецификация ограничивает возможные размеры звукового подслота (bSubslotSize) 1, 2, 3, 4 или 8 байтами на аудиоподслот. Аудио сэмпл представляется с использованием количества битов (bBitResolution), меньшего или равного общему количеству битов, доступных в звуковом подслоте, т.е. bBitResolution  bSubslotSize * 8.

Аудиослот состоит из набора аудио подслотов, каждый из которых содержит аудиосэмпл другого физического аудиоканала, взятый в один и тот же момент времени. Количество звуковых подслотов в аудиослоте равно количеству логических аудиоканалов в кластере аудиоканалов. Порядок расположения аудио подслотов в аудиослоте подчиняется правилам, изложенным в спецификации аудио USB. Все аудио-слоты должны иметь одинаковый размер аудио-слота.)

Ну вот уложили вот так PCM например. С виду, все правильно. Но возьмем для примера какую нибудь микросхему ЦАП, как там на вход данные должны передаваться:

То есть передаваться должно порциями последовательно побитно и сопровождаться управляющими и тактирующими сигналами микросхемы, причем начало и конец порции данных каждого канала не следуют один за другим.

Дальше читаем:

Audio data streams that are inherently continuous shall be packetized when sent over the USB. The quality of the packetizing algorithm directly influences the amount of effort needed to reconstruct a reliable sample clock at the receiving side.

(Потоки аудиоданных, которые по сути являются непрерывными, должны быть пакетированы при отправке через USB. Качество алгоритма пакетирования напрямую влияет на количество усилий, необходимых для восстановления надежных тактовых импульсов выборки на приемной стороне.)

Это по вашему тоже не надо распаковывать после приема? Данные в изохронном режиме USB передаются вот так:

Хост с периодом 1 мс формирует кадры (frames). Каждый кадр начинается с пакета-маркера SOF (Start Of Frame). В режиме HS кадр делится на 8 микрокадров. SOF передается в начале каждого микрокадра (с периодом 125 мс) с одинаковым номером кадра. Все транзакции завершаются до момента EOF (End Of Frame). По USB 2.0 в каждом микрокадре возможна передача до трех пакетов данных. Один пакет DATA0, два – DATA1, DATA0, три – DATA2, DATA1, DATA0. В транзакциях OUT для вывода не последнего пакета в микрокадре используется пакет MDATA. Во всех транзакциях, кроме последней в микрокадре, должны использоваться пакеты максимального размера. Для HS синхронизация осуществляется по нулевому микрокадру.

Контроль ошибок:

1. Пакеты начинаются с синхронизирующей последовательности, за которой следует его идентификатор PID, потом его инверсная копия check, если копии не совпадают, ошибка.

2. Тело пакета (все поля, включая PID и EOP) защищаются CRC кодом: 5-битный для пакетов-маркеров, 16-битный для пакетов данных. Несовпадение CRC с ожидаемым – ошибка.

3. Пакет завершается сигналом EOP. Если в пакете не целое число байт, он считается ошибочным.

4. В шину данные пакета передаются с использованием вставки бит (bit stuffing). После 6 единиц битов принудительно вставляется ноль.

Все это не надо перекодировать?

- 60 дБ +
⇡ в ответ @JaroslavS #
Все это не надо перекодировать?

согласен, надо ;)) Вы правы, Ярослав.

- 50 дБ +
⇡ в ответ @slava_jazz #

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

- 50 дБ +
Чтобы оставить комментарий, войдите, пожалуйста.