Ciao, Marco.
"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction."
— E. F. Schumacher (mis-attributed to A. Einstein)
________________________________________________________________________________
Autore della patch R2 per Squeezelite e del plugin C-3PO. note libere
Logitech media Server 7.9 > miniPc + squeezelite-R2 / SB+ > "Lu Scalmentu" NOS R2R DAC by TubeOne/ AudioResearch DAC 1-20 >
Klimo Merlino Gold TPS > DIS Interconnect > Kent Gold > Reference > Monitor Audio Studio 20 SE
guarda i log di squeezelite... te lo dice.
Se converte in PCM, scrive: "dsd_decode ... DSD to PCM output".
Se va in DoP, scrive: "dsd_decode ... DSDxxx stream, format: DOP, rate: nnnHz"
Se va in nativo: "dsd_decode ... DSDxxx stream, format: yyy, rate: nnnHz"
dove "yyy" =/= DoP.
sto dando una occhiata ai sorgenti per cercare di capirlo. In Linux "-D xxx" è obbligatorio, altrimenti non tenta neanche di uscire in DSD, ma converte in PCM (con la libreria dsd2pcm).
Se "xxx" è uguale a "dop" oppure è vuoto (omesso), l'uscita (per stream DSD) avviene in DoP. In caso contrario "xxx" deve essere uguale al formato utilizzato da ALSA per la propria interfaccia.
Presumibilmente in windows dovrebbe essere la stessa cosa... salvo che nei sorgenti non mi è parso di vedere parametri diversi da quelli per ALSA. Che siano gli stessi anche per windows? Devo verificare. Nel frattempo, potresti provarci.
Se non vado errato, in windows l'output è gestito attraverso "PortAudio". Che in effetti include una qualche forma di supporto per l'output su ASIO (sia su windows che su OS/X). Vedi i files:
include/portaudio.h
include/pa_asio.h
L'interfaccia sembrerebbe estremamente semplice e generica. Se è possibile utilizzarla per il DSD, verosimilmente nel codice di SL dovrebbe esserci / deve essere inserito qualcosa di analogo a quanto fatto per ALSA.
Ma andiamo avanti.
Il codice che effettua materialmente l'output, contenuto nel file "output_pa.c", è questo:
quindi, in effetti, apparentemente è prevista la possibilità di uscire in DSD "nativo" (non-dop) via portaudio.codice:if (!silence) { if (output.fade == FADE_ACTIVE && output.fade_dir == FADE_CROSS && *cross_ptr) { _apply_cross(outputbuf, out_frames, cross_gain_in, cross_gain_out, cross_ptr); } if (gainL != FIXED_ONE || gainR!= FIXED_ONE) { _apply_gain(outputbuf, out_frames, gainL, gainR); } IF_DSD( if (output.outfmt == DOP) { update_dop((u32_t *) outputbuf->readp, out_frames, output.invert); } else if (output.outfmt != PCM && output.invert) dsd_invert((u32_t *) outputbuf->readp, out_frames); ) memcpy(optr, outputbuf->readp, out_frames * BYTES_PER_FRAME);
"IF_DSD" è una macro (gestita dal preprocessore), definita nel file "squeezelite.h". È questa:
Che in sostanza non fa altro che aggiungere o eliminare quel pezzo di codice (quello racchiuso tra la coppia di parentesi tonde che seguono IF_DSD) a seconda che sia definita o meno la variabile "DSD" (opzione di compilazione). In pratica è un artificio "estetico"/stilistico per evitare dei brutti #ifdef ... #endif nel mezzo del codice.codice:#if defined(DSD) #undef DSD #define DSD 1 #define IF_DSD(x) { x } #else #undef DSD #define DSD 0 #define IF_DSD(x) #endif
In main.c si legge questo:
(banalmente la selezione del testo dell'help in linea)codice:#if DSD #if ALSA " -D [delay][:format]\tOutput device supports DSD, delay = optional delay switching between PCM and DSD in ms\n" " \t\t\t format = dop (default if not specified), u8, u16le, u16be, u32le or u32be.\n" #else " -D [delay]\t\tOutput device supports DSD over PCM (DoP), delay = optional delay switching between PCM and DoP in ms\n" #endif #endif
qui definisce le variabili ed imposta i default:
Qui viene interpretata l'opzione "-D" con i relativi parametri:codice:#if DSD unsigned dsd_delay = 0; dsd_format dsd_outfmt = PCM; #endif
Da notare che - sebbene nell'help non sia indicato - apparentemente quanto sopra viene incluso sempre, non solo per ALSA! (non c'è nessun "#if ALSA ... #endif")codice:#if DSD case 'D': dsd_outfmt = DOP; // qui imposta il default if (optind < argc && argv[optind] && argv[optind][0] != '-') { char *dstr = next_param(argv[optind++], ':'); char *fstr = next_param(NULL, ':'); dsd_delay = dstr ? atoi(dstr) : 0; /* * nella riga sopra imposta il delay (opzionale, def. 0), mentre qui sotto * imposta il formato di uscita in funzione dell'opzione scelta, se fornita: */ if (fstr) { if (!strcmp(fstr, "dop")) dsd_outfmt = DOP; if (!strcmp(fstr, "u8")) dsd_outfmt = DSD_U8; if (!strcmp(fstr, "u16le")) dsd_outfmt = DSD_U16_LE; if (!strcmp(fstr, "u32le")) dsd_outfmt = DSD_U32_LE; if (!strcmp(fstr, "u16be")) dsd_outfmt = DSD_U16_BE; if (!strcmp(fstr, "u32be")) dsd_outfmt = DSD_U32_BE; if (!strcmp(fstr, "dop24")) dsd_outfmt = DOP_S24_LE; if (!strcmp(fstr, "dop24_3")) dsd_outfmt = DOP_S24_3LE; } } break; #endif
A meno che i formati non siano gli stessi anche per il DSD nativo con ASIO (e stando a quanto diceva Marco mi pare di no), sospetto si tratti di un bug (introdotto dalla patch di Daphile?).
qui viene fatta una inizializzazione ("dsd_init" è definita nel file dsd.c):
dopo di che viene chiamata decode_init, ecc. (codice in comune per tutti i formati).codice:#if DSD dsd_init(dsd_outfmt, dsd_delay); #endif
A questo punto si tratta di mettere sotto la lente dsd.c e vedere se sono implementati i metodi specifici per l'output "nativo" via PA/ASIO, o se è necessario (e possibile) implementarli.
Ultima modifica di UnixMan : 11-02-2017 a 15:25
Ciao, Paolo.
«Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora 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.»
Ciao, Marco.
"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction."
— E. F. Schumacher (mis-attributed to A. Einstein)
________________________________________________________________________________
Autore della patch R2 per Squeezelite e del plugin C-3PO. note libere
Logitech media Server 7.9 > miniPc + squeezelite-R2 / SB+ > "Lu Scalmentu" NOS R2R DAC by TubeOne/ AudioResearch DAC 1-20 >
Klimo Merlino Gold TPS > DIS Interconnect > Kent Gold > Reference > Monitor Audio Studio 20 SE
forse il tuo DAC supporta fino a 192K... ma la scheda (l'interfaccia USB->I2S JLSounds) supporta comunque fino a 384k. Ed ovviamente il sistema "vede" ciò che gli dice l'interfaccia USB, non ne sa nulla di ciò che c'è a valle.
sì, ovviamente... non ho macchine con windows.
No, ho impostato 768000, che è il max supportato dalla scheda. Evidentemente SL interpreta quel parametro come LMS, cioè solo come max supportato (forse a meno che non abiliti il resampling, che nel mio caso non è neanche tra le opzioni con cui è stato compilato l'eseguibile).
Non puoi fare più "pagine"?
Altrimenti puoi fare semplicemente delle sezioni -sempre presenti - separate banalmente con un <HR> o roba del genere.
Sono da gestire quattro casi completamente diversi tra loro:
1) PCM->PCM
2) DSD->PCM
3) PCM->DSD
4) DSD->DSD
Io farei così:
per prima cosa, in cima devi mettere una opzione per scegliere il formato di uscita tra TRE possibilità:
PCM, DSD, invariato(*)
(*) invariato = uguale al formato di ingresso: PCM se PCM, DSD se DSD.
Dopo di che metti quattro "quadri" relativi ai quattro casi che devono essere gestiti (poi vediamo meglio in dettaglio uno per uno):
1) PCM->PCM: è esattamente (tutto) ciò che c'è già (non tocchi nulla);
2) DSD->PCM: qui devi mettere tutte le opzioni relative a questo caso: filtro/i p/b, formato di uscita, impostazioni di resample e dithering (come per 1);
3) PCM->DSD: idem; riduzione del guadagno (gain -h e/o fisso), impostazioni di resample (come per 1), scelta del filtro sdm (in luogo di quella del dithering).
4) DSD->DSD: idem; riduzione del guadagno (gain -h e/o fisso), filtro/i p/b, impostazioni di resample (come per 1), scelta del filtro sdm.
io metterei solo l'indicazione di un "target" s/r in uscita (max supportato o desiderato) e la scelta di se/quando attivare il resampling, ad es. con delle checkbox:
resample to target se input < DSDxxx? (yes/no)
resample to target se input > DSDxxx? (yes/no)
anche qui metterei una cosa analoga a quanto sopra... in questo caso banalmente una scelta del target s/r in uscita (fisso).
Oltre ovviamente alle varie opzioni di controllo del processo per sox, come detto sopra.
Edit: visto che alcune cose sono comuni, quale ad es. formati e target s/r per PCM e DSD, puoi mettere le relative opzioni una volta sola, in cima. Ma lasciando sempre entrambe, una per PCM ed una per DSD.
Per il resto lascierei separate le impostazioni di sox per i quattro casi.
per così funziona dsd2pcm: il s/r del pcm in uscita è sempre doppio rispetto a quello del DSD/32.
Quindi DSD64->DXD=352.8k, DSD128->705.6k, ecc.
Per quello è utile aggiungere DSD->PCM con sox sul server, via C-3PO. Con quello puoi produrre qualsiasi formato di uscita a prescindere dal formato di ingresso.
Ultima modifica di UnixMan : 11-02-2017 a 15:27
Ciao, Paolo.
«Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora 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.»
OK, come supponevo il codice e le impostazioni esistenti sono valide solo per ALSA.
Per windows resta solo DOP (o vanno implementate...).
frena...
al momento ancora nessuna... work in progress.
Ciao, Paolo.
«Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora 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.»
Marco hai PM
Ragionandoci sopra... bozza di interfaccia per C-3PO con supporto DSD:
codice:------------------------------------------ Generale: ------------------------------------------ Supported input formats (as is) Formato di uscita (tendina): PCM, DSD, invariato ------------------------------------------ Gain & general effects control: ------------------------------------------ Automatic headroom (as is) Manual gain reduction (in dB) (as is) LOUDNESS, balance, ch swap (as is) ------------------------------------------ Uscita PCM: ------------------------------------------ target s/r: (max supported, max sync) Resample PCM (as-is) PCM Output format (as is) PCM Bit-depth (as is) ------------------------------------------ PCM resampling options: (all as-is) ------------------------------------------ Quality Phase response Aliasing Minimal band-width Dithering Target bit depth Additional effects BEFORE/AFETR resampling ------------------------------------------ Uscita DSD: ------------------------------------------ target s/r: DSD64, DSD128, DSD256 Resample DSD (tendina): always never if required checkboxes: upsample if source < target downsample if source > target DSD Output format (tendina o radio-box): DSF DFF (gray out, future: al momento sox non supporta dff in uscita) ------------------------------------------ DSD resampling/conversion options: (opzioni per l'effetto "rate" di sox, simili a quelle per il PCM, + opzioni sdm) ------------------------------------------ res. Quality res. Phase response Aliasing Minimal band-width SDM filter (tendina: sdmX, ecc) Additional effects BEFORE/AFETR resampling ------------------------------------------ DSD input lowpass noise filters (when resampling or converting to PCM, DSD HF input noise must be filtered out) ad ogni riga corrisponde una istanza dell'effetto "lowpass" aggiunto alla cmd line di sox *prima* di rate; la tendina a sinistra specifica l'ordine del filtro; se off, il filtro non viene aggiunto (almeno uno, il primo, è obbligatorio) ------------------------------------------ 1: [1,2](tendina, def=2); cut-off freq (15KHz ... 50 KHz) (slider, def=22KHz) 2: [1,2,off](tendina, def=off); cut-off freq (15KHz ... 50 KHz) (slider, def=33KHz) 3: [1,2,off](tendina, def=off); cut-off freq (15KHz ... 50 KHz) (slider, def=44KHz) 4: [1,2,off](tendina, def=off); cut-off freq (15KHz ... 50 KHz) (slider, def=48KHz)
Ultima modifica di UnixMan : 11-02-2017 a 17:07
Ciao, Paolo.
«Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora 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.»
Mi ha scritto Kimmo di aver ricevuto da Mansur comunicazione di aver integrato le sue patch nel repository, quindi bisogna vedere cosa ha effettivamente integrato, per l'occasione, mi ha inviato una serie più completa di patches applicate a squeezelite, alcune in merito a DSD, confermandomi che DSS 'nativo' oggi ès olo per linux, per win e mac solo DOP, ancch ese ritiene sia possibile attivarlo, ma non sa come ed ovviamente non gli interessa.
Abbiamo smosso ben bene le acque, adesso bisogna rifare il punto.
Ciao, Marco.
"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction."
— E. F. Schumacher (mis-attributed to A. Einstein)
________________________________________________________________________________
Autore della patch R2 per Squeezelite e del plugin C-3PO. note libere
Logitech media Server 7.9 > miniPc + squeezelite-R2 / SB+ > "Lu Scalmentu" NOS R2R DAC by TubeOne/ AudioResearch DAC 1-20 >
Klimo Merlino Gold TPS > DIS Interconnect > Kent Gold > Reference > Monitor Audio Studio 20 SE
Ci sono attualmente 1 utenti che stanno visualizzando questa discussione. (0 utenti e 1 ospiti)