Спецификой Android, которая доставляет много неудобств аудиофилам, являеются библиотеки AudioHAL, в которых может быть зашита нежелателельная предобработка PCM-потока (в частности, down-sampling до 44.1кГц в некоторых реализациях, различные ограничения по числу входных и выходных каналов, разрядности и т.п).Даже если система использует полную версию ALSA взамен TinyALSA, и пакет alsautils работает корректно при воспроизведении и записи, то framework Андроида (по крайней мере 4.х.х для семейства процессоров RockChip 3xxx) все равно пропустит ВСЕ аудиоданные через AudioHAL как через фильтр, перед тем как они поступят на вход libasound.so (libALSA, которая конфигурируется через /etc/asound.conf) , и далее на вход аудио-класса приложения Android.
RockChip открыл код только начиная с SDK 4.4.х для процессоров RK3288, до этого библиотеки AudoHAL поставялись только в собранном (бинарном) варианте.Тем не менее, этот код может быть пересобран с изменениями и для среды Android 4.2.x. Есть ли в нем ограничения для исходного материала в формате S24_LE (24bit), можно посмотреть.
---------- Сообщение добавлено 05.08.2015 в 21:22 ----------
Библиотеку libasound.so и LADSPA с задержками к ней (cmt.so) для rk3066 уже публиковал на форуме ранее. Их работа достаточно долго проверялась натпрактике и она стабильна, но чтобы превратить устройство на rk3066 в DSP 4.1(5.1,6.1,7.1) нужна соответствующая многоканальная звуковая карта, либо перепаковка стерео-PCM потока в многоканальный, для последующего проброса через интерфейс SPDIF (оборудование на другом конце тоже должно понимать, что ему отправляется более двух каналов в определенной последовательности, в каждом фрейме).
USB Audio Pro обращается к звуковым адаптерам в обход ALSA, напрямую через USB Driver ядра. У этого приложения независимая от Андроид реализация звуковоспроизведения, и настройки на этом уровне доступны только через данное приложение (либо его разработчиков).
Звук в основном зависит от качества исходного материала. Сомнительно стремление к 24bit, если подавляющее большинство записей в 16 -битном формате? Задержки и фильтры в LADSPA, кстати, переводят все в FLOAT (с плавающей точкой) формат перед преобразованиями, а потом сворачивают в исходный. На качестве это никак не сказывается, если сравнить оригинал и обработаный сигнал, хотя потери казалось бы неизбежны(32 bit => 16 bit). Разрешающая способность кодека при этом не играет никакого рояля, это всего лишь еще одно преобразование 16bit=>24bit, если исходный материал был 16 bit.
Это как раз не вопрос. Перевод добавлением нулевых младших разрядов в 24 бит перед регулировкой громкости просто необходим. Но у меня пока конфигурирированием asound.conf этого сделать не получилось. Может быть как раз из-за ограничения в библиотеках альса на рк3066? Как бы проверить?
Этот перевод можно организовать на уровне внешнего ЦАП, т.к. этот код, видимо, не предполагает работу с длинными целыми:
По распознаваемым форматам тоже всё очень брутально:Код:#ifdef ALSA_VOLGAIN void volumeGain(const void * buffer, size_t len, int db) { short * buffer_end = (short*)buffer + (len/2); short * pcmData = (short *)buffer; int tmp; while(pcmData<buffer_end){ tmp = (int)(*pcmData)<<db; *pcmData = tmp > 32767 ? 32767 : (tmp < -32768 ? -32768 : tmp); ++pcmData; } } #endif
Эту часть надо либо переписывать, а потом проверять, либо использовать режим PassThrough, причем для этого, возможно, снимать сигнал с HDMI:Код:snd_pcm_format_t iformat = mHandle->format; if (format) { switch(*format) { case AudioSystem::FORMAT_DEFAULT: break; case AudioSystem::PCM_16_BIT: iformat = SND_PCM_FORMAT_S16_LE; break; case AudioSystem::PCM_8_BIT: iformat = SND_PCM_FORMAT_S8; break; default: LOGE("Unknown PCM format %i. Forcing default", *format); break; } if (mHandle->format != iformat) return BAD_VALUE; switch(iformat) { default: case SND_PCM_FORMAT_S16_LE: *format = AudioSystem::PCM_16_BIT; break; case SND_PCM_FORMAT_S8: *format = AudioSystem::PCM_8_BIT; break; } } return NO_ERROR;
, либо имплементировать для USB-устройств самостоятельно./*
* 1, FIXED: multi usb audio problem.
* 2, FIXED: adjust spdif volume.
* 3, FIXED: FM34 audio codec drain crash problem.
* 4, SUPPORT: Spdif Passthrough, current version support Dolby Digital AC3 5.1, AC3 2
* next version will support DTS 5.1 spdif passthrough.
* 5, SUPPORT: Hdmi 5point1 Multichannel audio output.
* 6, FIXED: SoundRecorder Pointer swing abnormally.
* 7, FIXED: The Recorder file duration is longer than the actual recording time(SoundRecorder.apk).
* 8, FIXED: no sound in the end of recording video by using camera.
* 9, SUPPORT: AGC, NS SUPPORT.
* 10,SUPPORT: HDMI I2S PASSTHROUGH SUPPORT.
*/
Пусть даже AudioHAL даунсэмплит до 44100 и двумя каналами ограничено, все равно все записи в родном CD-Audio слушаем... с этим пока можно смириться. Главное отрубить остальные "плюшечные" зло-эффекты (soundfx и т.д.).
А вот заменить (а вернее, не покупать) звуковой процессор засчет реализации софтового роутинга и обработки средствами LADSPA - это я понимаю! Трюк из разряда "смотри как я могу"
Я очень внимательно читал Ваши сообщения на форуме по альса с ладспа, и очень проникся идеей где-то с месяца 3 назад. Но тогда я уже успел приобрести то, что есть сейчас. С этим и борюсь
А для RK3066 есть ли возможность?
Социальные закладки