pico ha scritto:OK adesso mi è più chiaro... ma nel file di configurazione di alsa se volessi in ogni caso impostare la la mia ESI come default senza il dmix come devo fare?
basta che setti il default e lo fai puntare alla scheda (i.e., ometti dmix).
BTW, a titolo di esempio, questo è un mio file ~/.asoundrc (N.B.: è una vecchia versione che ho sottomano; mi sembra a posto ma non garantisco che non ci siano errori):
Codice: Seleziona tutto
#defaults.pcm.rate_converter "lavcrate"
#defaults.pcm.rate_converter "lavcrate_higher"
#defaults.pcm.rate_converter "samplerate"
#defaults.pcm.rate_converter "samplerate_best"
#defaults.pcm.rate_converter "speexrate"
#defaults.pcm.rate_converter "speexrate_best"
#defaults.pcm.dmix.rate 48000
#defaults.pcm.dmix.rate 88200
#defaults.pcm.dmix.rate 96000
#defaults.pcm.dmix.rate 176400
#defaults.pcm.dmix.rate 192000
############################################################################
# Give our cards some friendly aliases.
# Intel HDA analog
#
pcm.hda "default:CARD=Intel"
# Intel HDA digital (S/PDIF output)
#
pcm.hdad "iec958:CARD=Intel,DEV=0"
# Julia channels 1&2 (analog & tapped I2S out)
#
pcm.Juli12 "front:CARD=Juli,DEV=0"
# Julia channels 3&4 (optical out)
#
pcm.Juli34 "iec958:CARD=Juli,DEV=0"
############################################################################
# Upsampling slaves
############################################################################
# use sox for smart/complex upsampling...
pcm.HD {
type file
slave {
pcm null
}
format "raw"
file "| /usr/local/bin/sox-resample.sh %c %b %r"
}
pcm.hda192 {
type plug
slave {
pcm "hda"
rate 192000
}
}
pcm.J192 {
type plug
slave {
pcm "Juli12"
format S32_LE
channels 2
rate 192000
}
}
pcm.J176 {
type plug
slave {
pcm "Juli12"
format S32_LE
channels 2
rate 176400
}
}
pcm.J96 {
type plug
slave {
pcm "Juli12"
format S32_LE
rate 96000
}
}
pcm.JD96 {
type plug
slave {
pcm "Juli34"
format S32_LE
rate 96000
}
}
pcm.J88 {
type plug
slave {
pcm "Juli12"
format S32_LE
rate 88200
}
}
pcm.JD88 {
type plug
slave {
pcm "Juli34"
format S32_LE
rate 88200
}
}
pcm.J48 {
type plug
slave {
pcm "Juli12"
format S32_LE
rate 48000
}
}
pcm.JD48 {
type plug
slave {
pcm "Juli34"
format S32_LE
rate 48000
}
}
############################################################################
# 'multi' plugin allows us to create many slave devices and then distribute
# the stream's channels between the slaves.
#
# Here we define Slave a for Julia ch 1&2 (analog & I2S) and Slave b for
# HDA S/PDIF. Then we use channel binding to send channels 0 & 1 to the
# Juli@ and channels 2 & 3 to the Intel HDA.
#
pcm.multi4 {
type multi
slaves.a {
pcm "hda"
channels 2
}
slaves.b {
pcm "Juli12"
channels 2
}
bindings.0.slave a
bindings.0.channel 0
bindings.1.slave a
bindings.1.channel 1
bindings.2.slave b
bindings.2.channel 0
bindings.3.slave b
bindings.3.channel 1
}
############################################################################
# Here we are using the 'route' plugin to send the signal unchanged to
# a multi-channel device. Since the incoming stream is only 2-channel,
# we use the transfer table to copy channel 0 slave's input channel 0,
# channel 1 to slave's 1, and again channel 0 to slave's 2, etc.
# The last column (1.0) is the volume, which we are leaving unchanged.
pcm.both {
type route
slave {
pcm multi4
channels 4
}
ttable.0.0 1.0
ttable.1.1 1.0
ttable.0.2 1.0
ttable.1.3 1.0
}
############################################################################
pcm.M192 {
type plug
slave {
pcm "both"
format S32_LE
channels 2
rate 192000
}
}
#pcm.TV "hda"
pcm.TV "J192"
# set default device...
pcm.!default "J192"
#pcm.!default "HD"
come vedi, si può fare di tutto... (ed ogni utente può farlo indipendentemente dagli altri, se NON metti le modifiche nel file di sistema ma in quello nella home di ciascun utente).
pico ha scritto:Allego uno screenshot del mio alsamixer... mi spiegheresti cosa significa
1. H/W
2. Multi Tr
ovviamente, nomi e funzioni cambiano da una scheda all'altra. Se ti sposti selezionando i vari controlli, sul pannello in alto a Sx ti da i dettagli del controllo selezionato. Unitamente al nome
completo del controllo (nonostante spesso siano indubbiamente criptici...) ed alle opzioni possibili (prova a cambiarle...), di solito si riesce a capire di cosa si tratta.
Avere sottomano il manuale della scheda e conoscerne bene funzioni, controlli e possibilità varie aiuta.
In questo caso, le info specifiche le trovi quì:
http://alsa.opensrc.org/index.php/Ice1724
(trovato al volo con Google cercando "alsa mixer juli@"). Per comodità riporto quì la parte che ci interessa:
Codice: Seleziona tutto
=================== controls list =======================
> numid=1, iface=CARD,name='ICE1724 EEPROM'
EEPROM contents. not for mixer.
> numid=2, iface=MIXER,name='Multi Track Internal Clock'
the internal clock of the board.
Note that ice1724 has a single rate for all channels.
> numid=3, iface=MIXER,name='Multi Track Rate Locking'
the rate locking - allow each app to set the rate or use the fixed rate.
> numid=4, iface=MIXER,name='Multi Track Rate Reset'
reset the rate to the default value at each time the PCM is closed.
(the default value is the last internal clock rate.)
> numid=5, iface=MIXER,name='H/W Playback Route'
> numid=6, iface=MIXER,name='H/W Playback Route',index=1
> ...
> numid=12,iface=MIXER,name='H/W Playback Route',index=7
the analog output routing for each channel. they're enum.
> numid=13,iface=MIXER,name='Multi Track Peak'
peak meter. read only.
> numid=14,iface=MIXER,name='IEC958 Playback Route'
> numid=15,iface=MIXER,name='IEC958 Playback Route',index=1
spdif output routing (left/right). the enum valus.
> numid=16,iface=MIXER,name='IEC958 Output Switch'
turn on/off spdif output.
> numid=17,iface=PCM,name='IEC958 Playback Default',device=1
spdif status bits. 32bit long.
> numid=18,iface=MIXER,name='IEC958 Playback Con Mask',device=1
> numid=19,iface=MIXER,name='IEC958 Playback Pro Mask',device=1
available spdif status bit mask for consumer and professional modes.
> numid=20,iface=MIXER,name='DAC Volume'
> numid=21,iface=MIXER,name='DAC Volume',index=1
> ...
> numid=27,iface=MIXER,name='DAC Volume',index=7
DAC = digital-analog-converter for each analog output channel.
> numid=28,iface=MIXER,name='Master Playback Volume'
master playback volume for analog outputs.
> numid=29,iface=MIXER,name='ADC Volume'
> numid=30,iface=MIXER,name='ADC Volume',index=1
ADC = analog-digital-converter for each analog input channel.
> numid=31,iface=MIXER,name='Capture Route'
the recording source selection. the enum values.
Quindi, i controlli che nel mixer vedi abbreviati come "Multi Tr" (ma se li selezioni in alto a Sx vedi il nome completo) hanno a che fare con il controllo del clock della scheda (e quindi del sampling rate), mentre quelli abbreviati come "H/W" (H/W Playback Route) hanno a che fare con il "routing" dello stream audio in uscita.
pico ha scritto:Il mio problema è uscire dalla SPDIF della Juli@ senza resampling suonando alla frequenza originale nel modo più puro possibile.
questo non mi pare davvero un problema difficile...
questo non l'ho testato, ma salvo errori banali dovrebbe andare:
Codice: Seleziona tutto
# Julia channels 1&2 (analog & tapped I2S out)
pcm.Juli12 "front:CARD=Juli,DEV=0"
# Julia channels 3&4 (optical out)
pcm.Juli34 "iec958:CARD=Juli,DEV=0"
pcm.JDigital {
type plug
slave {
pcm "Juli34"
format S32_LE
# se vuoi un resampling fisso gestito direttamente da ALSA con uno
# degli algoritmi disponibili, scommenta la/e prox riga/e e setta il S/R
# desiderato in uscita e (se vuoi) l'algoritmo da utilizzare:
# rate 96000
# rate_converter "samplerate_best"
}
}
pcm.!default "JDigital"
BTW: IMO/IME, se il tuo DAC supporta S/R maggiori di 44/16, ti conviene decisamente fare resampling ("upsampling") via software prima di inviare lo stream alla scheda. Puoi usare direttamente ALSA con "samplerate" (che usa il famoso algoritmo "Secret Rabbit Code" o SRC) o "speexrate", che IME da anche lui ottimi risultati all'ascolto (ovviamente in entrambi i casi metti il suffisso "_best" per avere le opzioni ottimizzate per la max qualità).
In alternativa usa sox (da linea di comando) per fare resampling prima di mandare lo stream ad ALSA; le ultime versioni di sox (di nuovo, usa una distribuzione aggiornata: Ubuntu 10.04 LTS, Debian Squeeze, ecc) includono (anche) un algoritmo estremamente sofisticato e versatile (con le opzioni nella cmd line puoi configurarlo come vuoi, cambiando tutti i parametri possibili), migliore del SRC (che finora era stato il riferimento assoluto in quanto a qualità).
Oh, la versione di Sox in Ubuntu ha ancora un bug (identificato e segnalato dal sottoscritto...) per cui su macchine SMP (multi CPU e/o multicore) si "succhia" una gran quanità di CPU e causa underrun (skip) in continuazione.
Il workaround risolutivo (in attesa che prima o poi risolvano il problema alla radice) consiste semplicemente nello specificare l'opzione "--single-threaded" nella riga di comando (su Debian dopo la mia segnalazione lo hanno reso il default, per cui con Squeeze il bug non si manifesta a meno di non mettere esplicitamente l'opzione opposta, "--multi-threaded").
pico ha scritto:Scusa ma tu dove hai imparato come funziona alsa? Io provo a leggere la documentazione ma onestamente è poco chiara.
da quella (in particolare i due Wiki, quello ufficiale e quello... no), pezzi di informazioni ed esempi vari trovati qua e la sulla rete, qualche domanda sulla mailing list (di ALSA) ed infine... combattendoci un po in pratica.
(cmq, sia chiaro, non posso dire di essere un esperto in materia).
Ciao, Paolo.
«Se tu hai una mela, e io ho una mela, e ce le scambiamo, tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.»