Interessanti scoperte

Visualizzazione dei risultati da 1 a 10 su 20

Hybrid View

Messaggio precedente Messaggio precedente   Prossimo messaggio Prossimo messaggio
  1. #1
    pebibyte L'avatar di marcoc1712
    Registrato
    Jan 2013
    Messaggi
    5,254
    configurazione

    Predefinito Interessanti scoperte

    Avendo ripreso a litigare con Windows e Perl, cercando di aggirare i limiti che questa combinazione pone a LMS e , di rimando, a C-3PO, sto facendo alcune esperienze interessanti nel 'manovrare' i parametri dimensionali di buffer e latenza, verificando cosa succede.

    Potrebbe essere interessante costruire un 'minitool' di prova che consenta dinamicamente di variare la dimensione dei buffer, dei blocchi di dati trasferiti (period size) e conseguentemente della latenza.

    Quello che ho notato io è che da un certo punto il sistema comincia a generare 'vuoti' con interruzioni e singhiozzi chiaramente avvertibili quando il delay tra lo svuotamento del buffer e la disponibilità dei dati è > 1 ms, con valori inferiori, l'effetto non è così chiaramente avvertibile, il suono 'pare' comunque continuo, il che potrebbe anche essere provocato in qualche misura dalla presenza di buffer di dispositivo e/o sw nei diversi 'strati', da diverse gestioni' della condizione di errore nei diversi aplicativi o anche da questioni meramente psicoacustiche.

    Sul primo e sul terzo posso poco, in merito al secondo, ho provato a verificare ecome FLAC, SOX, FFMPEG ed un 'filtro' costruito da me con diverse impostazioni influenzano la riproduzione del suono in queste circostanze.

    Parto da quanto ho fatto io, è più semplice da spiegare:

    A parità di dimensione del buffer (e del segmento in uscita) più 'frammento' i blocchi spostati in ingresso al buffer, più il rischio di XRUN (in modo controintuitivo) aumentano. Usando pochi byte per volta, si producono sistematicamente (nella mia configurazione) dropouts, fino a circa 64/128 Kb sono intervallati 'regolarmente' rispetto al suono riprodotto, salendo, si riducono prima di durata relativa (il silenzio è via via più breve) quindi cominciano a ridursi di numero nel tempo (frequenza), fino a scomparire del tutto.

    Questa condizione è ESATTAMENTE riproducibile imponendo delle pause articificali al processo di riempimento del buffer, con il vantaggio di renderla più 'regolare' e sistematica (cioè si riduce via via la durata dei silenzi, ma la 'frequenza' rimane regolare).

    Ovviamente fino a che i 'buchi' sono avvertibili, il suono è inascoltabile, ma cosa sussede non appena cominciano ad essere non più 'direttamente' percepibili come tali?

    Nota bene:

    fino a che si utilizzano files a due canali, 44100 Hz e 16 bit, il problema è probabilmente accademico - almeno per gli applicativi che ho provato - ma salendo si rischia di raggiungerne i limiti, dato che TUTTI gli applicativi tentano di limitare la latenza introdotta semplicemente tenendo piccoli buffer e - conseguentemente - piccoli 'chrunch' di dati trasferiti, provocando un carico di CPU che sale in modo lineare rispetto al sample rate ed al bit depth, tutte condizioni che portano ad aumentare in modo significativo il rischio di XRUN.

    Quanto sopra è per me una conferma sulla bontà della scelta di fare trascoding e decoding sul server, disponendo di una 'macchina' sul client in grado di impostare convenientemente i buffers di riproduzione, con una elasticità sconosciuta agli strumenti disponibili sul server e - soprattutto - isolandosi da essi.

    Se le cose che sto facendo condurranno a buon fine, potrei anche decidere di rilasciare questo tool a corredo di C-3PO, così che ognuno possa provarne l'effetto direttamente (magari a qualcuno piace anche).
    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

  2. #2
    tebibyte L'avatar di UnixMan
    Registrato
    Sep 2013
    Messaggi
    2,529
    configurazione

    Predefinito

    Originariamente inviato da marcoc1712
    Ovviamente fino a che i 'buchi' sono avvertibili, il suono è inascoltabile, ma cosa sussede non appena cominciano ad essere non più 'direttamente' percepibili come tali?
    vediamo se indovino... viene fuori un suono più "aperto" e "brillante", apparentemente più dettagliato... insomma il famoso "windows sound"?
    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.»

  3. #3
    pebibyte L'avatar di marcoc1712
    Registrato
    Jan 2013
    Messaggi
    5,254
    configurazione

    Predefinito

    Originariamente inviato da UnixMan
    vediamo se indovino... viene fuori un suono più "aperto" e "brillante", apparentemente più dettagliato... insomma il famoso "windows sound"?
    La mia è una domanda , aspetto i vs. commenti e possibilmente anche qualche 'misura' a corredo da chi è in rado di farle.
    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

  4. #4
    tebibyte L'avatar di UnixMan
    Registrato
    Sep 2013
    Messaggi
    2,529
    configurazione

    Predefinito

    Originariamente inviato da marcoc1712
    La mia è una domanda ,
    da come lo avevi detto, pensavo tu avessi già provato e sentito "l'effetto che fa"...
    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.»

  5. #5
    pebibyte L'avatar di marcoc1712
    Registrato
    Jan 2013
    Messaggi
    5,254
    configurazione

    Predefinito

    Originariamente inviato da UnixMan
    da come lo avevi detto, pensavo tu avessi già provato e sentito "l'effetto che fa"...
    Si, certo che l'ho sentito, ma dato che in questo caso CERTAMENTE l'autosuggestione è attiva ed eccome, qualsiasi cosa scrivessi non avrebbe nessuna attendibilità.
    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

  6. #6
    pebibyte L'avatar di marcoc1712
    Registrato
    Jan 2013
    Messaggi
    5,254
    configurazione

    Predefinito

    Questo è il codice C da compilare:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    #include <time.h>
    
    #define UBUFFER_INT8_SIZE 65536
    #define ELEMENT_SIZE 1 // element size in bytes.
    #define ELEMENT_COUNT 4096 // number of elements asked to fread per cycle (min 1 max UBUFFER_INT8_SIZE).
    #define DELAY 0 //delay in milliseconds added to every pump cicle.
    #define LOGFILE "F:/cPump.log"
    
    #if defined _MSC_VER || defined __MINGW32__
    #include <sys/utime.h> /* for utime() */
    #include <io.h> /* for chmod(), _setmode(), unlink() */
    #include <fcntl.h> /* for _O_BINARY */
    #else
    #include <sys/types.h> /* some flavors of BSD (like OS X) require this to get time_t */
    #include <utime.h> /* for utime() */
    #endif
    #if defined __CYGWIN__ || defined __EMX__
    #include <io.h> /* for setmode(), O_BINARY */
    #include <fcntl.h> /* for _O_BINARY */
    #endif
    #include <sys/stat.h> /* for stat(), maybe chmod() */
    #if defined _WIN32 && !defined __CYGWIN__
    #else
    #include <unistd.h> /* for unlink() */
    #endif
    #if defined _WIN32 && !defined __CYGWIN__
    // for GetFileInformationByHandle() etc
    #include <windows.h>
    #include <winbase.h>
    #endif
    
    #if defined(_MSC_VER) && _MSC_VER < 1600
    
    /* Microsoft Visual Studio earlier than the 2010 version did not provide
     * the 1999 ISO C Standard header file <stdint.h>.
     */
    
    typedef __int8 x__int8;
    typedef unsigned __int8 x__uint8;
    
    typedef __int16 x__int16;
    typedef __int32 x__int32;
    typedef __int64 x__int64;
    typedef unsigned __int16 x__uint16;
    typedef unsigned __int32 x__uint32;
    typedef unsigned __int64 x__uint64;
    
    #else
    
    /* For MSVC 2010 and everything else which provides <stdint.h>. */
    
    #include <stdint.h>
    
    typedef int8_t x__int8;
    typedef uint8_t x__uint8;
    
    typedef int16_t x__int16;
    typedef int32_t x__int32;
    typedef int64_t x__int64;
    typedef uint16_t x__uint16;
    typedef uint32_t x__uint32;
    typedef uint64_t x__uint64;
    
    #endif
    
    typedef int x__bool;
    
    static union {
        x__int8 s8[UBUFFER_INT8_SIZE];
        x__uint8 u8[UBUFFER_INT8_SIZE];
        x__int16 s16[UBUFFER_INT8_SIZE/2];
        x__uint16 u16[UBUFFER_INT8_SIZE/2];
    } ubuffer;
    
    void delay(int milliseconds)
    {
        long pause;
        clock_t now,then;
    
        pause = milliseconds*(CLOCKS_PER_SEC/1000);
        now = then = clock();
        while( (now-then) < pause )
            now = clock();
    }
    FILE *get_binary_stdin(void)
    {
        /* if something breaks here it is probably due to the presence or
         * absence of an underscore before the identifiers 'setmode',
         * 'fileno', and/or 'O_BINARY'; check your system header files.
         */
    #if defined _MSC_VER || defined __MINGW32__
        _setmode(_fileno(stdin), _O_BINARY);
        //ioctlsocket(_fileno(stdin), FIONBIO,1);
    
    #elif defined __CYGWIN__
        /* almost certainly not needed for any modern Cygwin, but let's be safe... */
        setmode(fileno(stdin), O_BINARY);
    
    #elif defined __EMX__
        setmode(fileno(stdin), O_BINARY);
    
    #endif
        
        return stdin;
    }    
    
    FILE *get_binary_stdout(void)
    {
        /* if something breaks here it is probably due to the presence or
         * absence of an underscore before the identifiers 'setmode',
         * 'fileno', and/or 'O_BINARY'; check your system header files.
         */
    #if defined _MSC_VER || defined __MINGW32__
        _setmode(_fileno(stdout), _O_BINARY);
    #elif defined __CYGWIN__
        /* almost certainly not needed for any modern Cygwin, but let's be safe... */
        setmode(fileno(stdout), _O_BINARY);
    #elif defined __EMX__
        setmode(fileno(stdout), O_BINARY);
    #endif
        return stdout;
    }
    
    int pump (FILE *infile, FILE *outfile, size_t elementSize, size_t elementCount, int millisecond, FILE *logfile){
    
        size_t element_read;
        size_t element_write;
        size_t total_read;
        size_t total_write;
        x__bool keepOn = 1;
    
        total_write=0;
        total_read=0;
    
        fprintf(logfile, "element size is : %d, element cound is: %d\n",elementSize, elementCount);
    
        while(keepOn) {
    
            element_read = fread(ubuffer.u8, elementSize, elementCount, infile);
    
            if (!element_read){
                fprintf(logfile, "element read is undef\n");
                fflush (logfile);
                element_read=0;
            }
    
            total_read = total_read + (element_read*elementSize);
    
            if (ferror(infile)){
                
                fprintf(logfile, "ERROR during read STDIN %d\n",ferror(infile));
                fflush (logfile);
                return 0;
            
            } else {
    
                element_write = fwrite(ubuffer.u8, elementSize, element_read, outfile);
    
                total_write = total_write + (element_write*elementSize);
                fflush(outfile);
    
                if(element_write != element_read) {
                    if(errno == EPIPE){
                        fprintf(logfile, "ERROR %d during write to STDOUT 1\n", errno);
                        fflush (logfile);
                        return 0;
                    } else {
                        fprintf(logfile, "ERROR %d during write to STDOUT 2\n", errno);
                        fflush (logfile);
                    }
                }
                else if(element_write == 0) {
    
                    if(ferror(outfile)) {
                        fprintf(logfile, "ERROR during write fo STDOUT 3\n");
                        fflush (logfile);
                        return 0;
                    }
                }
            }
    
            if (feof(infile)) {
            
                keepOn=0;
    
                fprintf(logfile, "detected EOF\n");
                fflush (logfile);
    
            } else if (millisecond){
    
                delay (millisecond);
            }
        }
        return total_write;
    }
    
    int main(int argc, char** argv) {
    
        FILE *logfile = fopen(LOGFILE,"w");
        FILE *infile = get_binary_stdin();
        FILE *outfile = get_binary_stdout();
        
        size_t elementSize=ELEMENT_SIZE;
        size_t elementCount = ELEMENT_COUNT;
        int delay = DELAY;
    
        size_t total=0;
    
        fprintf(logfile, "element size is : %d, element cound is: %d, delay is: %d\n",elementSize, elementCount, delay);
        fflush (logfile);
    
        total = pump(infile, outfile, elementSize, elementCount, delay, logfile);
    
        fprintf(logfile, "copied %d bytes\n", total );
        
        fflush (outfile);
        fclose (outfile);
        
        fprintf(logfile, "outfile closed");
    
        fflush (logfile);
        fclose (logfile);
    
        return 0;
    }
    
    
    }
    Le righe da modificare sono:

    codice:
    #define ELEMENT_SIZE 1 // element size in bytes.
    #define ELEMENT_COUNT 4096 // number of elements asked to fread per cycle (min 1 max UBUFFER_INT8_SIZE).
    #define DELAY 0 //delay in milliseconds added to every pump cicle.
    #define LOGFILE "F:/cPump.log"
    dove:

    ELEMENT_SIZE si puà anche impostare a valori diversi (es. il world leght di un frame, 4 per stream stereo a 16bit, 8 per 32), ma è conveniente lasciarlo a 1 per semplicità nei calcoli.

    ELEMENT_COUNT è il numero di elementi letti in un ciclo (della dimensione di ELEMENT_SIZE), concettualmente corrisponde al 'period size' di alsa. é bene non superi UBUFFER_INT8_SIZE/ 2* ELEMENT_SIZE (32768, se non si modificano UBUFFER_INT8_SIZE ed ELEMENT_SIZE). .

    Questo è l'elemento che provoca il diverso 'profilo' di esecuzione. più il valore è alto meno interrupt il sistema genererà, a 1 il mio sistema va proprio in crash, oltre 64/128 i buchi scompaiono del tutto.

    DELAY è il 'ritardo' imposto artificialmente ad ogni ciclo per provocae xrun di durata e frequenza desiderata.

    LOGFILE è ...il logfile. ATTENZIONE non c'è nessun controllo, inserite un pathname valido, se esiste lo cancella e sovrascrive ad ogni esecuzione.
    Ultima modifica di marcoc1712 : 11-01-2017 a 17:03
    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

  7. #7
    gibibyte L'avatar di DacPassion
    Registrato
    Jul 2014
    Messaggi
    1,250

    Predefinito

    ...sarà che mi sono perso diverse puntate ma non ti seguo :-D
    Clearaudio Emotion + Satisfy + Grado Gold1 > Phono D3A DIY
    Futro S450 + Daphile / Amanero + Buffalo 2 (trident) uscita a TU Cinemag 15/15B DIY / Jlsounds + Lector Digicode TDA1541 S1
    Monoblocchi D3A 2A3 (electrolytich free!!) DIY / Coral Beta8 in BLH DIY

  8. #8
    pebibyte L'avatar di marcoc1712
    Registrato
    Jan 2013
    Messaggi
    5,254
    configurazione

    Predefinito

    Originariamente inviato da DacPassion
    ...sarà che mi sono perso diverse puntate ma non ti seguo :-D
    In realtà è la prima puntata...

    L'antefatto (litigate con Perl - il inguaggio di programmazione principale di LMS - su Windows) è una lunga storia, solo parzialmente riportata nei vari thd di LMS, ricordi il problema con QOBUZ in windows? Se non ricoro male interessava sicuramente Filippo, ma anche te se non sbaglio?

    La soluzione trovata è parziale e vorrei trovarene una migliore, ma non è così semplice, pare che qualcuno ci si sia messo apposta per complicare le cose, forse per problemi di salvaguardia dei copyright, o quantomeno di disencentivo, non so, sta di fatto che mi sono imbarcato in una cosa a basso livello che mi permette di controllare in modo fine i flussi tra le diverse applicazioni e verificare quello che succede.

    Molto istruttivo.
    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

  9. #9
    Moderatore L'avatar di bibo01
    Registrato
    Oct 2010
    Messaggi
    4,591
    configurazione

    Predefinito

    Questo "minitool" potrebbe funzionare su qualsiasi Windows Audio PC a prescindere da LMS?

  10. #10
    pebibyte L'avatar di marcoc1712
    Registrato
    Jan 2013
    Messaggi
    5,254
    configurazione

    Predefinito

    Originariamente inviato da bibo01
    Questo "minitool" potrebbe funzionare su qualsiasi Windows Audio PC a prescindere da LMS?
    In realtà non è altro che un programma in c++ che prevede di essere alimentato in ingresso dal suo STDIN e fornisce l'ouput sulla sua STDOUT, simulando il comportamento di una 'normale' pipe in linux.

    da linea di comando va lanciato tipo:

    FLAC -dcs miofile.flac | minitool | SOX (o mio player o...) ...

    il fatto di poter essere impiegato o meno su altri players dipende da come questi vengono 'alimentati'.

    EDIT: Nasce in win per puro caso, non c'è motivo per cui non debba funzionare in qualsiasi altro OS, ma il compilatore, l'OS ed i driver di dispositivo mettono tutti del loro, quindi prima di trarre conclusioni occorre verificare quello che succede realmente, il punto è riuscire a portare il sistema nella condizione 'critica' di equilibrio tra il 'consumo' e la 'portata, quindi verificare come questo risponde agli inevitabili xRun e l'effetto 'acustico' che produce.
    Ultima modifica di marcoc1712 : 11-01-2017 a 15:27
    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

Informazioni Thread

Users Browsing this Thread

Ci sono attualmente 1 utenti che stanno visualizzando questa discussione. (0 utenti e 1 ospiti)

Regole d'invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
nexthardware.com - © 2002-2022