Цитата Сообщение от 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