Ушел в ЛАС
Технический директорArray
Репутация: лучше не знать
Регистрация
11.01.2004
Город/село
Столиця
Сообщений
13,050
Спасибо (Раздал)
11289
Спасибо (Получил)
14942
Re: USB DAC и USB Audio для Android
Сообщение от aluver
Мне на рокчипе 3066 ввиду отсутствия в прошивке библиотеки ресемплера последний вариант видится неплохим для получения вывода без потерь в 24 битах с регулировкой громкости на ГУ.
Сравнивал на sgs3 звук сабры u2 через наушники AKG 271 mkII при воспроизведении лосслесса 44.1/16 на правильно настроенных Poweramp (с апсемплингом до 24/96 средствами ядра) и Neutron (с собственным апсемплингом Аудиофил до 24/96) - разницы особой не услышал. У нейтрона может самую малость меньше "зерно".
Хочу дополнить, что в BSP для RockChip 3xxx ресемплинг производится средствами ALSA, т.к. в /etc/asound.conf аудиоустройства прописаны типом plug, что предоставляет возможность, в большинстве случаев, конвертировать аудиоданные "на лету" в подходящий формат для slave.hw:
После прочтения съесть!
Код:
# Android ALSA configuration file for RK30 TV BOX.
# Author: zxg@rock-chips.com TV dept.
##
## Mixer Devices
##
ctl.AndroidOut{
type hw
card 0
}
ctl.AndroidIn{
type hw
card 0
}
ctl.AndroidPlayback {
type hw
}
ctl.AndroidRecord {
type hw
}
##казусов.
## # Speaker
##
pcm.AndroidPlayback_Speaker_normal {
type plug
slave.pcm {
type hw
card 0
device 0
}
}
pcm.AndroidPlayback_Speaker_incall{
type plug
slave.pcm {
type hw
card 0
device 0
}
}
pcm.AndroidPlayback_Speaker_ringtone{
type plug
slave.pcm {
type hw
card 0
device 0
}
}
##
## # Earpiece
##
pcm.AndroidPlayback_Earpiece_normal{
type plug
slave.pcm {
type hw
card 0
device 0
}
}
pcm.AndroidPlayback_Earpiece_incall{
type plug
slave.pcm {
type hw
card 0
device 0
}
}
pcm.AndroidPlayback_Earpiece_ringtone{
type plug
slave.pcm {
type hw
card 0
device 0
}
}
##
## # Headset
##
pcm.AndroidPlayback_Headset_normal {
type plug
slave.pcm {
type hw
card 0
device 0
}
}
pcm.AndroidPlayback_Headset_incall{
type plug
slave.pcm {
type hw
card 0
device 0
}
}
pcm.AndroidPlayback_Speaker_Headset_ringtone{
type plug
slave.pcm {
type hw
card 0
device 0
}
}
pcm.AndroidPlayback_Speaker_Headset_normal {
type plug
slave.pcm {
type hw
card 0
device 0
}
}
##
## # Aux
##
pcm.AndroidPlayback_Aux_normal {
type plug
slave.pcm {
type hw
card 0
device 0
}
}
pcm.AndroidPlayback_Aux_incall{
type plug
slave.pcm {
type hw
card 0
device 0
}
}
pcm.AndroidPlayback_Speaker_Aux_ringtone{
type plug
slave.pcm {
type hw
card 0
device 0
}
}
pcm.AndroidPlayback_Speaker_Aux_normal {
type plug
slave.pcm {
type hw
card 0
device 0
}
}
##
## # Spdif
##
pcm.AndroidPlayback_Spdif_normal {
type plug
slave.pcm {
type hw
card 1
device 0
}
}
pcm.AndroidPlayback_Spdif_incall{
type plug
slave.pcm {
type hw
card 1
device 0
}
}
pcm.AndroidPlayback_Speaker_Spdif_ringtone{
type plug
slave.pcm {
type hw
card 1
device 0
}
}
##
## # usbaudio
##
pcm.AndroidPlayback_Usbaudio_3_normal {
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 3
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'PCM Playback Switch'
optional true
value 1
}
]
}
}
}
pcm.AndroidPlayback_Usbaudio_3_incall{
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 3
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'PCM Playback Switch'
optional true
value 1
}
]
}
}
}
pcm.AndroidPlayback_Speaker_Usbaudio_3_ringtone{
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 3
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'PCM Playback Switch'
optional true
value 1
}
]
}
}
}
pcm.AndroidPlayback_Speaker_Usbaudio_3_normal {
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 3
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'PCM Playback Switch'
optional true
value 1
}
]
}
}
}
##
## # usbaudio_1
##
pcm.AndroidPlayback_Usbaudio_4_normal {
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 4
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'PCM Playback Switch'
optional true
value 1
}
]
}
}
}
pcm.AndroidPlayback_Usbaudio_4_incall{
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 4
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'PCM Playback Switch'
optional true
value 1
}
]
}
}
}
pcm.AndroidPlayback_Speaker_Usbaudio_4_ringtone{
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 4
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'PCM Playback Switch'
optional true
value 1
}
]
}
}
}
pcm.AndroidPlayback_Speaker_Usbaudio_4_normal {
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 4
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'PCM Playback Switch'
optional true
value 1
}
]
}
}
}
##
## # usbaudio_2
##
pcm.AndroidPlayback_Usbaudio_5_normal {
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 5
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'PCM Playback Switch'
optional true
value 1
}
]
}
}
}
pcm.AndroidPlayback_Usbaudio_5_incall{
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 5
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'PCM Playback Switch'
optional true
value 1
}
]
}
}
}
pcm.AndroidPlayback_Speaker_Usbaudio_5_ringtone{
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 5
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'PCM Playback Switch'
optional true
value 1
}
]
}
}
}
pcm.AndroidPlayback_Speaker_Usbaudio_5_normal {
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 5
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'PCM Playback Switch'
optional true
value 1
}
]
}
}
}
##
## # AndroidCapture
##
pcm.AndroidCapture {
type plug
slave.pcm {
type hw
card 0
device 0
}
}
##
## # AndroidCapture usbaudio
##
pcm.AndroidCapture_Usbaudio_3_normal {
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 3
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'Mic Capture Switch'
optional true
value 1
}
]
}
}
}
pcm.AndroidCapture_Usbaudio_3_incall {
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 3
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'Mic Capture Switch'
optional true
value 1
}
]
}
}
}
##
## # AndroidCapture usbaudio_1
##
pcm.AndroidCapture_Usbaudio_4_normal {
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 4
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'Mic Capture Switch'
optional true
value 1
}
]
}
}
}
pcm.AndroidCapture_Usbaudio_4_incall {
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 4
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'Mic Capture Switch'
optional true
value 1
}
]
}
}
}
##
## # AndroidCapture usbaudio_2
##
pcm.AndroidCapture_Usbaudio_5_normal {
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 5
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'Mic Capture Switch'
optional true
value 1
}
]
}
}
}
pcm.AndroidCapture_Usbaudio_5_incall {
type plug
slave.pcm {
type hooks
slave.pcm{
type hw
card 5
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'Mic Capture Switch'
optional true
value 1
}
]
}
}
}
##
## # BT
##
pcm.AndroidPlayback_Bluetooth_incall {
type plug
slave.pcm {
type hw
card 0
device 1
}
}
pcm.AndroidPlayback_Bluetooth_normal {
type plug
slave.pcm {
type hw
card 0
device 1
}
}
Отсюда пропала необходимость подключать ресемплер из libspeex через AudioHAL-библиотеки (как в многочисленных иных реализациях Андроида).
Ядро linux в данном процессе по прежнему не задействовано. Алгоритм ресемплирования присутствовал все время в /system/lib/libasound.so в старых BSP, а в последний SDK для rk3288 уже собирается как /system/lib/tinyalsa.so
В журнале Андроида это будет выглядеть так:
После прочтения съесть!
Код:
I/RkAudioPlayer( 1609): mAudioSink->open in mSampleRate = 48000 channels = 2
I/RkAudioPlayer( 1609): audio mode: 0
I/AudioTrack( 1609): set() streamType 3 frameCount 4458 flags 0000 channelMask 3 sampleRate 48000 format 1
I/FFplayer( 1609): ******************************************
I/FFplayer( 1609):
I/FFplayer( 1609): pause in
D/FFplayer( 1609): pause_l
I/FFplayer( 1609): starting main player thread:2014-1-21
I/FFplayer( 1609):
I/FFplayer( 1609):
I/FFplayer( 1609): ******************************************
I/FFplayer( 1609): decodeMovie:mCurrentState = 8
D/FFplayer( 1609): start ok
E/DecodeAudio( 1609): mStream->codec->channels = 2 mStream->codec->sample_rate = 48000
I/FFplayer( 1609): decodeMovie:BufferingPlayer 0x0
I/FFMpegThread( 1609): starting thread
E/FFplayer( 1609): Hery, FF_MediaPlayer::BufferingPlayer
D/DecodeAudio( 1609): prepare()
E/DecodeAudio( 1609): mConfig->nrChans = -1,mConfig->samplingRate = 0
D/FFplayer( 1609): pause_l**1
D/FFplayer( 1609): pause_l**2
D/FFplayer( 1609): pause_l**3
D/FFplayer( 1609): pause_l**4
D/FFplayer( 1609): pause_l**5
D/FFplayer( 1609): end of onBufferingThread
V/ALSAModule( 1609): SAMPLERATE:44100
D/ALSAModule( 1609): open called for devices 00000800 in mode 0...
D/ALSAModule( 1609): DevName: AndroidPlayback_Spdif_normal
E/ALSAModule( 1609): buffersize: 3072, periodsize:1024
V/ALSAModule( 1609): Set PLAYBACK PCM format to S16_LE (Signed 16 bit Little Endian)
V/ALSAModule( 1609): Using 2 channels for PLAYBACK.
V/ALSAModule( 1609): Set PLAYBACK sample rate to 44100 HZ
E/ALSAModule( 1609): audio type flag: 0
V/ALSAModule( 1609): Buffer size: 3072(frames) period Size: 1024(frames) periods: 3 (buffersize=periodSize*periods)
V/ALSAModule( 1609): Latency: 69659 periodTime: 23219
D/ALSAModule( 1609):
D/ALSAModule( 1609): DumpHandleInfo:
D/ALSAModule( 1609): devices: 0xbfff
D/ALSAModule( 1609): format: 0x2
D/ALSAModule( 1609): channels: 2
D/ALSAModule( 1609): sampleRate: 44100
D/ALSAModule( 1609): latency: 69659
D/ALSAModule( 1609): periodSize:1024
D/ALSAModule( 1609): bufferSize:3072
Кроме того, встроенный ресемплер обнаруживается в вызовах RkAudioPlayer, при этом обращений к библиотекам ALSA не происходит:
После прочтения съесть!
Код:
E/FFplayer( 1609): estimate_timings:0: start_time: -9223372036854.775 duration: 7.895,base_time.den=96000,base_time.num=1
E/FFplayer( 1609): stream: start_time: -9223372036854.775 duration: 82.242 bitrate=4608 kb/s
E/FFplayer( 1609): audio name = pcm_s24le
D/FFplayer( 1609): AudioStartTime=0,VideoStartTime=-1,tmpTime=-1
D/FFplayer( 1609): setDataSource:start_time set 0
E/FFplayer( 1609): FILE = /mnt/internal_sd/Music/194435__psuess__tanbura-96khz24bit.wav
D/FFplayer( 1609): prepareAsync:prepare
I/FFplayer( 1609): prepare in
I/FFplayer( 1609): prepareVideo
E/FFplayer( 1609): mVideoStreamIndex is -1
I/FFplayer( 1609): prepareAudio
E/FFplayer( 1609): Hery, Audio stream->codec->codec_id = 65548
D/FFplayer( 1609): open MediaDecoder.cfg failed,so can't config anything
D/FFplayer( 1609): File not exists!
I/FFplayer( 1609): prepareSubtitle
I/FFplayer( 1609): prepare ok
W/MediaPlayer( 2211): info/warning (952, 0)
D/mali_winsys( 2211): new_window_surface returns 0x3000
W/gralloc ( 130): Debugmem The fd=68, in vmalloc !!!! Ishwc=0
I/MediaFocusControl( 485): AudioFocus requestAudioFocus() from android.media.AudioManager@418f3478com.rockchip.mediacenter.plugins.musicplay.l@418e9548
V/MediaPlaybackService( 1936): AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT
E/MediaPlayer( 2211): Should have subtitle controller already set
V/Avrcp ( 997): New genId = 14, clearing = 1
I/FFplayer( 1609): pause in
D/FFplayer( 1609): pause_l
E/FFplayer( 1609): start in mCurrentState in
E/FFplayer( 1609): start in mCurrentState = 8
D/FFplayer( 1609): initAudioPlayer
I/RkAudioPlayer( 1609): mAudioSink->open in mSampleRate = 44100 channels = 2
I/RkAudioPlayer( 1609): audio mode: 0
I/AudioTrack( 1609): set() streamType 3 frameCount 4096 flags 0000 channelMask 3 sampleRate 44100 format 1
На этапах отладки системы надежнее использовать собственный /etc/asound.conf, в котором каждый интерфейс определен type hw, вместо type plug. Позже можно вернуться к стандартной конфигурации, найдя подходящее Андроид-приложение для воспроизведения аудио. Либо зафиксировать в конфигурации безусловный "апсемлинг" к желаемому формату аудиопотока, чтобы избежать казусов с повторным ресемлингом. И, естественно, контролировать командой logcat на консоли отладочные сообщения приложений, чтобы понимать, какой формат был реально отравлен в сторону кодека для воспроизведения.
На стоковой прошивке через штатный кодек RKES8323, в режиме Spdif Passthrough, только системное приложение Music не попыталось привести тестовую запись 24bit/48kHz к 16bit/44.1kHz:
После прочтения съесть!
Код:
E/FFplayer( 1609): FILE = /mnt/internal_sd/Music/110408__sandyrb__tubular-009.wav
D/FFplayer( 1609): prepareAsync:prepare
I/FFplayer( 1609): prepare in
I/FFplayer( 1609): prepareVideo
E/FFplayer( 1609): mVideoStreamIndex is -1
I/FFplayer( 1609): prepareAudio
E/FFplayer( 1609): Hery, Audio stream->codec->codec_id = 65548
D/FFplayer( 1609): open MediaDecoder.cfg failed,so can't config anything
D/FFplayer( 1609): File not exists!
I/FFplayer( 1609): prepareSubtitle
I/FFplayer( 1609): prepare ok
E/MediaPlayer( 1936): Should have subtitle controller already set
E/FFplayer( 1609): start in mCurrentState in
E/FFplayer( 1609): start in mCurrentState = 8
D/FFplayer( 1609): initAudioPlayer
I/FFplayer( 1609): ******************************************
I/FFplayer( 1609):
I/FFplayer( 1609): starting main player thread:2014-1-21
I/RkAudioPlayer( 1609): mAudioSink->open in mSampleRate = 48000 channels = 2
I/FFplayer( 1609):
I/FFplayer( 1609):
I/FFplayer( 1609): ******************************************
I/RkAudioPlayer( 1609): audio mode: 0
I/FFplayer( 1609): decodeMovie:mCurrentState = 8
I/AudioTrack( 1609): set() streamType 3 frameCount 4458 flags 0000 channelMask 3 sampleRate 48000 format 1
D/FFplayer( 1609): start ok
E/DecodeAudio( 1609): mStream->codec->channels = 2 mStream->codec->sample_rate = 48000
I/FFplayer( 1609): decodeMovie:BufferingPlayer 0x0
I/FFMpegThread( 1609): starting thread
D/DecodeAudio( 1609): prepare()
E/FFplayer( 1609): Hery, FF_MediaPlayer::BufferingPlayer
D/FFplayer( 1609): end of onBufferingThread
, но в тех же условиях тест 24bit/96kHz при воспроизведении был преобразован к 16bit/44.1kHz
Да тута я Яж работаю, как все не нормальные люди по выходным)
Вообщем новости плохие. Схема вроде бы до безобразия проста. А не хрена не работает. Со звуковухи сигнал идёт, а вот uh1 его не видит.
Часа два бился, тут или я рукожом или с китацкой хераборай бяда.
НО, момент один, когда через SF опрашиваеш uh1 он типа как активируется и опять пишет
А потом когда закрываешь SF опять пишет что соединения нет
Вообщем новости плохие. Схема вроде бы до безобразия проста. А не хрена не работает. Со звуковухи сигнал идёт, а вот uh1 его не видит.
Наушники точно выдергивал из x-fi?
Что все-таки у тебя в "Записывающих устройствах" винды на запись на ноуте с uh1? Какие настройки?
Для примера вот для микрофонного входа
У тебя должны быть устройства для входов UH1 аналогично - и оптики, и кокса.
Хочу дополнить, что в BSP для RockChip 3xxx ресемплинг производится средствами ALSA, т.к. в /etc/asound.conf аудиоустройства прописаны типом plug, что предоставляет возможность, в большинстве случаев, конвертировать аудиоданные "на лету" в подходящий формат для slave.hw
Спасибо огромное! Не дополнил, а полностью изменил показания, чем вселил таки надежду!
Как доберусь до ГУ - покопаюсь, надо конфиг альсы прошерстить. Вроде все через plug там и было - приведенный тобой конфиг кажется до боли знакомым, он универсален скорее всего для рокчипов.
На каком рокчипе сейчас это пробуешь? Насильное апсемплирование до 96кГц не пробовал? Кодом предусмотрено такое? Или только даунсемплит?
попытайтесь обойтись без ASIO. Китайские дрова ASIO обычно очень глючные. На моем ЦАПе от HIFIMEDIY он не стал дружить с ASIO4ALL.
У меня устойчиво работала связка VSThost и виртуальных проводов от VB Audio.
И еще, если будете использовать виндовый микшер (DS или ММЕ) - громкость на макс. и в свойствах устройств ставьте именно ту частоту, на которой работать будете, а не максимально возможную.
Социальные закладки