К вопросу про подключение внешних USB звуковых карт и аудио-контроллеров (например, чтобы организовать оптический S/PDIF выход на своем планшете) к устройствам на Android.

Готовые решения USB Audio для Android:




Предыстория

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

Подключая внешнюю звуковую карту к USB OTG порту устройство будет определяться, но в отсутствии драйверов snd-usb-audio смонтировано быть не сможет, что можно наблюдать через выдачу команды dmesg:
Код:
<7>[  547.500579]
<7>[  547.500671]
<7>[  547.500714] insmod_host_driver
<7>[  547.500770]
<7>[  547.520487] [sw_hcd0]: sw_usb_host0_enable start
<7>[  547.525757] -------sw_hcd0_soft_disconnect---------
<7>[  547.555838] [sw_hcd0]: open_usb_clock
<7>[  547.606616] [sw_hcd0]: host_init_state = 0
<7>[  547.630811] [sw_hcd_host0]: Set USB Power ON
<7>[  547.636014] [sw_hcd0]: sw_usb_host0_enable end
<7>[  547.807819]
<7>[  547.807913] ------------IRQ CONNECT-------------
<7>[  547.807986]
<7>[  547.970800] [sw_hcd]: reset port.
<7>[  548.030412] [sw_hcd]: reset port stopped.
<7>[  548.034841] spurious?
<6>[  548.090560] usb 1-1: new high speed USB device number 2 using sw_hcd_host0
<7>[  548.099068] [sw_hcd]: reset port.
<7>[  548.165755] [sw_hcd]: reset port stopped.
<7>[  548.230104] [sw_hcd]: sw_hcd_h_disable, epnum = 0
<7>[  548.234814] [sw_hcd]: sw_hcd_h_disable, epnum = 0
, а также в списке USB-устройств по команде lsusb
Код:
Bus 001 Device 001: ID 1d6b:0001
Bus 002 Device 001: ID 1d6b:0002
Bus 003 Device 001: ID 1d6b:0001
Bus 004 Device 001: ID 1d6b:0002
Bus 005 Device 001: ID 1d6b:0001
Bus 004 Device 002: ID 0bda:8179
Bus 001 Device 010: ID 041e:3020
, но новых устройств в /dev/snd/ не появляется.

Первые шаги в направлении интеграции были сделаны любителями в рамках разработки платформы CyanogenMod, snd-usb-audio уже присутствуют в последних сборках, и, устроив дичайшие "пляски с бубном", можно попытаться настроить драйвера и продвинуться на шаг вперед, а если повезет - и на два:

После прочтения съесть!


Ранние эксперименты

Пока разрабочики самого Андроида только внесли поддержу USB DAC в список задач:
https://code.google.com/p/android/is...%20Sta%20%20rs
http://forum.xda-developers.com/show...5&postcount=21
, начали появляться сторонние продукты с ограниченной поддержкой внешних USB Audio устройств.

Нажмите на изображение для увеличения
Название: Usb-Audio-2.jpg
Просмотров: 0
Размер:	54.1 Кб
ID:	427194Нажмите на изображение для увеличения
Название: Usb-Audio-1.jpg
Просмотров: 0
Размер:	114.8 Кб
ID:	427196

В настоящее время доступна как полная,
http://www.extreamsd.com/USBAudioRecorderPRO/
, так и пробная
http://www.audio-evolution.com/downl...rial_1.2.5.apk
версии приложения USB Audio Recorder PRO ,

После прочтения съесть!


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

После прочтения съесть!

USBAudioDevice: fd = 4294967295, opened = 1, Vend/Prod = 0x41e / 0x3020, USBrev = 200, configs = 1
USBAudioDevice: Manufacturer = , Product = , SerialNr =
USBConfiguration: # interfaces = 3, config val = 1, config string = , attr = 0xc0, maxPower = 2mA
USBConfiguration: SELF POWERED!
USBInterface: interface nr = 0
USBAltSetting1: alt setting = 0, class = AUDIO, subclass = AUDIOCONTROL, protocol = 0, descr =
USBEndPoint: nr = 3, IN, TRANSFER_TYPE_INTERRUPT, SYNC_TYPE_NONE,
maxPacket = 8, addT = 0, pollingInt = 512, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBInputTerminal: m_ID = 1, assoc = 0 m_logicalOutputChannels = 8, m_channelConfig = 1599, , , STREAMING
USBInputTerminal: m_ID = 4, assoc = 0 m_logicalOutputChannels = 2, m_channelConfig = 3, , , GENERIC_DIGITAL
USBFeatureUnit1: m_ID = 6, SourceID = 4, m_controlSize = 2, channels = 3
m_ID = 6, channel control = 1 (Mute )
m_ID = 6, channel control = 2 ( Volume )
m_ID = 6, channel control = 2 ( Volume )
USBInputTerminal: m_ID = 7, assoc = 0 m_logicalOutputChannels = 2, m_channelConfig = 3, , , LINE
USBFeatureUnit1: m_ID = 8, SourceID = 7, m_controlSize = 2, channels = 3
m_ID = 8, channel control = 1 (Mute )
m_ID = 8, channel control = 2 ( Volume )
m_ID = 8, channel control = 2 ( Volume )
USBMixerUnit: m_ID = 16, ins = 3, outs = 8
USBMixerUnit1: input 0 = 1
USBMixerUnit1: input 1 = 6
USBMixerUnit1: input 2 = 8
USBMixerUnit1: bmControls 0 = 0 (hex)
USBFeatureUnit1: m_ID = 18, SourceID = 16, m_controlSize = 2, channels = 9
m_ID = 18, channel control = 1 (Mute )
m_ID = 18, channel control = 2 ( Volume )
m_ID = 18, channel control = 2 ( Volume )
m_ID = 18, channel control = 2 ( Volume )
m_ID = 18, channel control = 2 ( Volume )
m_ID = 18, channel control = 2 ( Volume )
m_ID = 18, channel control = 2 ( Volume )
m_ID = 18, channel control = 2 ( Volume )
m_ID = 18, channel control = 2 ( Volume )
USBFeatureUnit1: m_ID = 28, SourceID = 23, m_controlSize = 1, channels = 7
m_ID = 28, channel control = 1 (Mute )
m_ID = 28, channel control = 0 ( )
m_ID = 28, channel control = 0 ( )
m_ID = 28, channel control = 0 ( )
m_ID = 28, channel control = 0 ( )
m_ID = 28, channel control = 0 ( )
m_ID = 28, channel control = 0 ( )
USBOutputTerminal: m_ID = 19, assoc = 0, source = 28, , TERMINAL_TYPE_OUTPUT_SPEAKER
USBSelectorUnit: m_ID = 31, m_nrInPins = 2
USBSelectorUnit: input 0 = 17
USBSelectorUnit: input 1 = 21
USBFeatureUnit1: m_ID = 30, SourceID = 31, m_controlSize = 1, channels = 3
m_ID = 30, channel control = 1 (Mute )
m_ID = 30, channel control = 0 ( )
m_ID = 30, channel control = 0 ( )
USBOutputTerminal: m_ID = 20, assoc = 0, source = 30, , TERMINAL_TYPE_OUTPUT_HEADPHONES
USBSelectorUnit: m_ID = 29, m_nrInPins = 3
USBSelectorUnit: input 0 = 17
USBSelectorUnit: input 1 = 27
USBSelectorUnit: input 2 = 4
USBFeatureUnit1: m_ID = 22, SourceID = 29, m_controlSize = 1, channels = 3
m_ID = 22, channel control = 1 (Mute )
m_ID = 22, channel control = 0 ( )
m_ID = 22, channel control = 0 ( )
USBOutputTerminal: m_ID = 24, assoc = 0, source = 22, , GENERIC_DIGITAL
USBFeatureUnit1: m_ID = 11, SourceID = 17, m_controlSize = 2, channels = 3
m_ID = 11, channel control = 2 ( Volume )
m_ID = 11, channel control = 0 ( )
m_ID = 11, channel control = 0 ( )
USBFeatureUnit1: m_ID = 12, SourceID = 7, m_controlSize = 2, channels = 3
m_ID = 12, channel control = 2 ( Volume )
m_ID = 12, channel control = 0 ( )
m_ID = 12, channel control = 0 ( )
USBFeatureUnit1: m_ID = 13, SourceID = 4, m_controlSize = 2, channels = 3
m_ID = 13, channel control = 2 ( Volume )
m_ID = 13, channel control = 0 ( )
m_ID = 13, channel control = 0 ( )
USBSelectorUnit: m_ID = 14, m_nrInPins = 3
USBSelectorUnit: input 0 = 12
USBSelectorUnit: input 1 = 13
USBSelectorUnit: input 2 = 11
USBOutputTerminal: m_ID = 15, assoc = 0, source = 14, , STREAMING
USBInterface: interface nr = 1
USBAltSetting1: alt setting = 0, class = AUDIO, subclass = AUDIOSTREAMING, protocol = 0, descr =
USBAltSetting1: alt setting = 1, class = AUDIO, subclass = AUDIOSTREAMING, protocol = 0, descr =
USBAltSetting1 (AS): link = 1, delay(f) = 0, Undefined, type(1) = 1, ch = 2, subframesize = 2, reso = 16
44100 (fixed)
USBEndPoint: nr = 1, OUT, , SYNC_TYPE_ASYNC,
maxPacket = 180, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBEndPoint: nr = 1, IN, , SYNC_TYPE_NONE, USAGE_TYPE_FEEDBACK
maxPacket = 4, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBAltSetting1: alt setting = 2, class = AUDIO, subclass = AUDIOSTREAMING, protocol = 0, descr =
USBAltSetting1 (AS): link = 1, delay(f) = 0, Undefined, type(1) = 1, ch = 2, subframesize = 3, reso = 24
44100 (fixed)
USBEndPoint: nr = 1, OUT, , SYNC_TYPE_ASYNC,
maxPacket = 270, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBEndPoint: nr = 1, IN, , SYNC_TYPE_NONE, USAGE_TYPE_FEEDBACK
maxPacket = 4, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBAltSetting1: alt setting = 3, class = AUDIO, subclass = AUDIOSTREAMING, protocol = 0, descr =
USBAltSetting1 (AS): link = 1, delay(f) = 0, PCM, type(1) = 1, ch = 2, subframesize = 2, reso = 16
48000 (fixed)
USBEndPoint: nr = 1, OUT, , SYNC_TYPE_ASYNC,
maxPacket = 196, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBEndPoint: nr = 1, IN, , SYNC_TYPE_NONE, USAGE_TYPE_FEEDBACK
maxPacket = 4, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBAltSetting1: alt setting = 4, class = AUDIO, subclass = AUDIOSTREAMING, protocol = 0, descr =
USBAltSetting1 (AS): link = 1, delay(f) = 0, PCM, type(1) = 1, ch = 2, subframesize = 3, reso = 24
48000 (fixed)
USBEndPoint: nr = 1, OUT, , SYNC_TYPE_ASYNC,
maxPacket = 294, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBEndPoint: nr = 1, IN, , SYNC_TYPE_NONE, USAGE_TYPE_FEEDBACK
maxPacket = 4, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBAltSetting1: alt setting = 5, class = AUDIO, subclass = AUDIOSTREAMING, protocol = 0, descr =
USBAltSetting1 (AS): link = 1, delay(f) = 0, PCM, type(1) = 1, ch = 2, subframesize = 2, reso = 16
96000 (fixed)
USBEndPoint: nr = 1, OUT, , SYNC_TYPE_ASYNC,
maxPacket = 388, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBEndPoint: nr = 1, IN, , SYNC_TYPE_NONE, USAGE_TYPE_FEEDBACK
maxPacket = 4, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBAltSetting1: alt setting = 6, class = AUDIO, subclass = AUDIOSTREAMING, protocol = 0, descr =
USBAltSetting1 (AS): link = 1, delay(f) = 0, PCM, type(1) = 1, ch = 2, subframesize = 3, reso = 24
96000 (fixed)
USBEndPoint: nr = 1, OUT, , SYNC_TYPE_ASYNC,
maxPacket = 582, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBEndPoint: nr = 1, IN, , SYNC_TYPE_NONE, USAGE_TYPE_FEEDBACK
maxPacket = 4, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBAltSetting1: alt setting = 7, class = AUDIO, subclass = AUDIOSTREAMING, protocol = 0, descr =
USBAltSetting1 (AS): link = 1, delay(f) = 0, PCM, type(1) = 1, ch = 4, subframesize = 2, reso = 16
48000 (fixed)
USBEndPoint: nr = 1, OUT, , SYNC_TYPE_ASYNC,
maxPacket = 392, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBEndPoint: nr = 1, IN, , SYNC_TYPE_NONE, USAGE_TYPE_FEEDBACK
maxPacket = 4, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBAltSetting1: alt setting = 8, class = AUDIO, subclass = AUDIOSTREAMING, protocol = 0, descr =
USBAltSetting1 (AS): link = 1, delay(f) = 0, PCM, type(1) = 1, ch = 4, subframesize = 3, reso = 24
48000 (fixed)
USBEndPoint: nr = 1, OUT, , SYNC_TYPE_ASYNC,
maxPacket = 588, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBEndPoint: nr = 1, IN, , SYNC_TYPE_NONE, USAGE_TYPE_FEEDBACK
maxPacket = 4, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBAltSetting1: alt setting = 9, class = AUDIO, subclass = AUDIOSTREAMING, protocol = 0, descr =
USBAltSetting1 (AS): link = 1, delay(f) = 0, PCM, type(1) = 1, ch = 4, subframesize = 2, reso = 16
96000 (fixed)
USBEndPoint: nr = 1, OUT, , SYNC_TYPE_ASYNC,
maxPacket = 776, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!
USBEndPoint: nr = 1, IN, , SYNC_TYPE_NONE, USAGE_TYPE_FEEDBACK
maxPacket = 4, addT = 0, pollingInt = 8, refresh = 0, syncEndp = 0, , NO FREQ CONTROL!

, все равно не получается выбрать в качестве устройства для воспроизведения (поддержки .mp3 пока нет, но .wav можно прослушать через встроенный динамик планшета, а на .ogg программа намертво зависла). Отправил отладочную информацию и комментарии разработчикам.

USB Audio на Nokia N900

По опыту интеграции с другим несовместимым linux-устройством, в моем случае Nokia N900 и OS Maemo 5, последовательность действий для запуска карты должна быть примерно следующей:
1. Загрузка модулей ядра
Код:
Nokia-N900:~# modprobe snd-usb-audio
2. Подключение звукового адаптера к USB OTG, проверка выдачи dmesg и lsusb
3. Рестарт карты и перезагрузка сервиса
Код:
Nokia-N900:~# /etc/init.d/alsa-utils reset 1 ; /etc/init.d/alsa-utils restart 1
, где 1 - это номер устройства, т.к. встроенный звуковой адаптер 0. Также можно использовать all для перезапуска всех.
4. Проверка состояния командой
Nokia-N900:~# amixer -c 1

После прочтения съесть!

Simple mixer control 'Master',0
Capabilities: pvolume pswitch pswitch-joined penum
Playback channels: Front Left - Front Right - Rear Left - Rear Right - Front C enter - Woofer - Side Left - Side Right
Limits: Playback 0 - 183
Mono:
Front Left: Playback 146 [80%] [0.00dB] [on]
Front Right: Playback 146 [80%] [0.00dB] [on]
Rear Left: Playback 144 [79%] [0.00dB] [on]
Rear Right: Playback 144 [79%] [0.00dB] [on]
Front Center: Playback 146 [80%] [0.00dB] [on]
Woofer: Playback 146 [80%] [0.00dB] [on]
Side Left: Playback 144 [79%] [0.00dB] [on]
Side Right: Playback 144 [79%] [0.00dB] [on]
Simple mixer control 'Headphone',0
Capabilities: pswitch pswitch-joined penum
Playback channels: Mono
Mono: Playback [on]
Simple mixer control 'Headphone Source',0
Capabilities: enum
Items: 'Front' 'Side'
Item0: 'Front'
Simple mixer control 'Speaker',0
Capabilities: pswitch pswitch-joined penum
Playback channels: Mono
Mono: Playback [on]
Simple mixer control 'Line',0
Capabilities: pvolume cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined cswitch-exclusive penum
Capture exclusive group: 0
Playback channels: Front Left - Front Right
Capture channels: Mono
Limits: Playback 0 - 231 Capture 0 - 46
Mono: Capture 40 [87%] [5.21dB] [on]
Front Left: Playback 207 [90%] [5.37dB] [on]
Front Right: Playback 207 [90%] [5.37dB] [on]
Simple mixer control 'CMSS LED',0
Capabilities: pswitch pswitch-joined penum
Playback channels: Mono
Mono: Playback [off]
Simple mixer control 'Digital In',0
Capabilities: pvolume cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined cswitch-exclusive penum
Capture exclusive group: 0
Playback channels: Front Left - Front Right
Capture channels: Mono
Limits: Playback 0 - 207 Capture 0 - 46
Mono: Capture 40 [87%] [5.21dB] [off]
Front Left: Playback 207 [100%] [0.00dB] [on]
Front Right: Playback 207 [100%] [0.00dB] [on]
Simple mixer control 'Digital Out',0
Capabilities: pswitch pswitch-joined penum
Playback channels: Mono
Mono: Playback [off]
Simple mixer control 'Digital Out Source',0
Capabilities: enum
Items: 'Front' 'PCM' 'Digital In'
Item0: 'Front'
Simple mixer control 'Dolby Digital LED',0
Capabilities: pswitch pswitch-joined penum
Playback channels: Mono
Mono: Playback [off]
Simple mixer control 'Power LED',0
Capabilities: pswitch pswitch-joined penum
Playback channels: Mono
Mono: Playback [on]
Simple mixer control 'What-U-Hear',0
Capabilities: cvolume cvolume-joined cswitch cswitch-joined cswitch-exclusive penum
Capture exclusive group: 0
Capture channels: Mono
Limits: Capture 0 - 46
Mono: Capture 40 [87%] [5.21dB] [off]

5. Проверка воспроизведения из командной строки
Код:
~ $ mplayer -ao alsa:device=hw=1.0 *.flac
MPlayer 1.0rc3-4.4.4 (C) 2000-2009 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing 01.Civil War.flac.
Audio only file format detected.
==========================================================================
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
AUDIO: 44100 Hz, 2 ch, s16le, 920.0 kbit/65.20% (ratio: 115005->176400)
Selected audio codec: [ffflac] afm: ffmpeg (FFmpeg FLAC audio)
==========================================================================
AO: [alsa] 48000Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A:  23.3 (23.2) of 462.0 (07:42.0)  1.0%
6. В случае успеха - поиск путей интеграции с системой. Например, KMPlayer позволяет выбирать драйвер и устройство из числа подключенных

После прочтения съесть!




Полезные темы: