USB DAC и USB Audio для Android

Тема: USB DAC и USB Audio для Android

Метки:
  1. Аватар для HoSStiA

    HoSStiA сказал(-а):

    USB DAC и USB Audio для Android

    К вопросу про подключение внешних 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 позволяет выбирать драйвер и устройство из числа подключенных

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




    Полезные темы:
    Последний раз редактировалось HoSStiA; 08.12.2013 в 20:21.
    Власти Израиля и редакция журнала АвтоЗвук с террористами и читателями в переговоры не вступают (c) AE
  cc by-nc-sa