⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abx.c

📁 音频编码
💻 C
📖 第 1 页 / 共 3 页
字号:
    sx = k->n > 1  ?  sqrt ( (k->x2 - k->x*k->x/k->n) / (k->n - 1) )  :  0.l;    sy = k->n > 1  ?  sqrt ( (k->y2 - k->y*k->y/k->n) / (k->n - 1) )  :  0.l;    x  = k->n > 0  ?  k->x/k->n  :  0.l;    y  = k->n > 0  ?  k->y/k->n  :  0.l;        b  = sx != 0   ?  sy/sx * sgn(r)  :  0.l;    if (verbose)        fprintf ( stderr, "r=%Lf  sx=%Lf  sy=%Lf  x=%Lf  y=%Lf  b=%Lf\n", r, sx, sy, x, y, b );    return b;}int  feed ( int fd, const stereo_t* p, int len ){    write ( fd, p, sizeof(stereo_t) * len );    return len;}short  round ( double f ){    long  x = (long) floor ( f + 0.5 );    return x == (short)x  ?  (short)x  :  (short) ((x >> 31) ^ 0x7FFF);}int  feed2 ( int fd, const stereo_t* p1, const stereo_t* p2, int len ){    stereo_t  tmp [30000];   /* An arbitrary size, hope that no overruns occure */    int       i;        if (len > sizeof(tmp)/sizeof(*tmp))        len = sizeof(tmp)/sizeof(*tmp);    for ( i = 0; i < len; i++ ) {        double f = cos ( M_PI/2*i/len );        f *= f;        tmp [i] [0] = round ( p1 [i] [0] * f + p2 [i] [0] * (1. - f) );        tmp [i] [1] = round ( p1 [i] [1] * f + p2 [i] [1] * (1. - f) );    }    write ( fd, tmp, sizeof(stereo_t) * len );    return len;}int feedfac ( int fd, const stereo_t* p1, const stereo_t* p2, int len, double fac1, double fac2 ){    stereo_t  tmp [30000];   /* An arbitrary size, hope that no overruns occure */    int       i;        if (len > sizeof(tmp)/sizeof(*tmp))        len = sizeof(tmp)/sizeof(*tmp);    for ( i = 0; i < len; i++ ) {        tmp [i] [0] = round ( p1 [i] [0] * fac1 + p2 [i] [0] * fac2 );        tmp [i] [1] = round ( p1 [i] [1] * fac1 + p2 [i] [1] * fac2 );    }    write ( fd, tmp, sizeof(stereo_t) * len );    return len;}void setup ( int fdd, int samples, long freq ){    int status, org, arg;    // Nach vorn verschoben    if ( -1 == (status = ioctl (fdd, SOUND_PCM_SYNC, 0)) )        perror ("SOUND_PCM_SYNC ioctl failed");    org = arg = 2;    if ( -1 == (status = ioctl (fdd, SOUND_PCM_WRITE_CHANNELS, &arg)) )        perror ("SOUND_PCM_WRITE_CHANNELS ioctl failed");    if (arg != org)        perror ("unable to set number of channels");    fprintf (stderr, "%1u*", arg);    org = arg = 16;    if ( -1 == (status = ioctl (fdd, SOUND_PCM_WRITE_BITS, &arg)) )        perror ("SOUND_PCM_WRITE_BITS ioctl failed");    if (arg != org)        perror ("unable to set sample size");    fprintf (stderr, "%2u bit ", arg);    org = arg = AFMT_S16_LE;    if ( -1 == ioctl (fdd, SNDCTL_DSP_SETFMT, &arg) )        perror ("SNDCTL_DSP_SETFMT ioctl failed");    if ((arg & org) == 0)        perror ("unable to set data format");    org = arg = freq;    if ( -1 == (status = ioctl (fdd, SOUND_PCM_WRITE_RATE, &arg)) )        perror ("SOUND_PCM_WRITE_WRITE ioctl failed");    fprintf (stderr, "%5u Hz*%.3f sec\n", arg, (double)samples/arg );    org = arg = DMA_SAMPLES;    if ( -1 == (status = ioctl (fdd, SNDCTL_DSP_SETFRAGMENT, &arg)) )        perror ("SNDCTL_DSP_SETFRAGMENT ioctl failed");}void Message ( const char* s, size_t index, long freq, size_t start, size_t stop ){    unsigned long  norm_index = 100lu * index / freq;    unsigned long  norm_start = 100lu * start / freq;    unsigned long  norm_stop  = 100lu * stop  / freq;    fprintf ( stderr, "\rListening %s  %2lu:%02lu.%02lu  (%1lu:%02lu.%02lu...%1lu:%02lu.%02lu)%*.*s\rListening %s",              s,              norm_index / 6000, norm_index / 100 % 60, norm_index % 100,              norm_start / 6000, norm_start / 100 % 60, norm_start % 100,              norm_stop  / 6000, norm_stop  / 100 % 60, norm_stop  % 100,              36 - (int)strlen(s), 36 - (int)strlen(s), "",              s );    fflush  ( stderr );}size_t  calc_true_index ( size_t index, size_t start, size_t stop ){    if ( start >= stop )        return start;    while ( index - start < DMA_SAMPLES )        index += stop - start;    return index - DMA_SAMPLES;}void testing ( const stereo_t* A, const stereo_t* B, size_t len, long freq ){    int     c;    int     fd    = open ( "/dev/dsp", O_WRONLY );    int     rnd   = random_number ();   /* Auswahl von X */    int     state = 0;                  /* derzeitiger F黷tungsmodus */    float   fac1  = 0.5;    float   fac2  = 0.5;    size_t  start = 0;    size_t  stop  = len;    size_t  index = start;                  /* derzeitiger Offset auf den Audiostr鰉en */    char    message [80] = "A  ";    setup ( fd, len, freq );    while ( 1 ) {        c = sel ();        if ( c == 27 )            c = sel () + 0x100;        switch ( c ) {        case 'A' :        case 'a' :            strcpy ( message, "A  " );            if ( state != 0 )                state = 2;            break;        case 0x100+'0' :        case '0' :        case 'B' :        case 'b' :            strcpy ( message, "  B" );            if ( state != 1 )                state = 3;            break;        case 'X' :        case 'x' :            strcpy ( message, " X " );            if ( state != rnd )                state = rnd + 2;            break;        case 'm' :            state = 8;            break;        case 'M' :            state = (state & 1) + 4;            break;                    case 'x'&0x1F:            state = (state & 1) + 6;            break;        case ' ':            start = 0;            stop  = len;            break;        case 'o'  :	    start = calc_true_index ( index, start, stop);            break;        case 'p'  :	    stop  = calc_true_index ( index, start, stop);            break;        case 'h'  :            if ( start > freq/100 )                start -= freq/100;            else                start = 0;            index = start;            continue;        case 'j'  :            if ( start < stop-freq/100 )                start += freq/100;            else                start = stop;            index = start;            continue;        case 'k'  :            if ( stop > start+freq/100 )                stop -= freq/100;            else                stop = start;            continue;        case 'l'  :            if ( stop < len-freq/100 )                stop += freq/100;            else                stop = len;            continue;        case '\n':            index = start;            continue;        case 'D'+0x100:            strcpy ( message, "Difference (+40 dB)" );            state = 9;            fac1  = -100.;            fac2  = +100.;            break;        case 'd'+0x100:            strcpy ( message, "Difference (+30 dB)" );            state = 9;            fac1  = -32.;            fac2  = +32.;            break;        case 'D' & 0x1F :            strcpy ( message, "Difference (+20 dB)" );            state = 9;            fac1  = -10.;            fac2  = +10.;            break;        case 'D' :            strcpy ( message, "Difference (+10 dB)" );            state = 9;            fac1  = -3.;            fac2  = +3.;            break;        case 'd' :            strcpy ( message, "Difference (  0 dB)" );            state = 9;            fac1  = -1.;            fac2  = +1.;            break;        case 0x100+'1' :        case 0x100+'2' :        case 0x100+'3' :        case 0x100+'4' :        case 0x100+'5' :        case 0x100+'6' :        case 0x100+'7' :        case 0x100+'8' :        case 0x100+'9' :            sprintf ( message, "  B (Errors -%c dB)", (char)c );            state = 9;            fac2  = pow (10., -0.05*(c-0x100-'0') );            fac1  = 1. - fac2;            break;        case '1' :        case '2' :        case '3' :        case '4' :        case '5' :        case '6' :        case '7' :        case '8' :        case '9' :            sprintf ( message, "  B (Errors +%c dB)", c );            state = 9;            fac2  = pow (10., 0.05*(c-'0') );            fac1  = 1. - fac2;            break;        case 'A' & 0x1F:            fprintf (stderr, "   Vote for X:=A" );            eval ( rnd == 0 );            rnd   = random_number ();            if ( state == 6  &&  state == 7 )                state = 6 + rnd;            else if ( state != rnd )                state = rnd + 2;            strcpy ( message," X " );            break;        case 'B' & 0x1F:            fprintf (stderr, "   Vote for X:=B" );            eval ( rnd == 1 );            rnd   = random_number ();            if ( state == 6  &&  state == 7 )                state = 6 + rnd;            else if ( state != rnd )                state = rnd + 2;            strcpy ( message," X " );            break;        case -1:            break;        default:            fprintf (stderr, "\a" );            break;        case 'Q':        case 'q':            fprintf ( stderr, "\n%-79.79s\r", "Quit program" );            close (fd);            fprintf ( stderr, "\n\n");            return;        }        switch (state) {        case 0: /* A */            if ( index + BF >= stop )                index += feed (fd, A+index, stop-index );            else                index += feed (fd, A+index, BF );            break;        case 1: /* B */            if ( index + BF >= stop )                index += feed (fd, B+index, stop-index );            else                index += feed (fd, B+index, BF );            break;        case 2: /* B => A */            if ( index + BF >= stop )                index += feed2 (fd, B+index, A+index, stop-index );            else                index += feed2 (fd, B+index, A+index, BF );            state = 0;            break;        case 3: /* A => B */            if ( index + BF >= stop )                index += feed2 (fd, A+index, B+index, stop-index );            else                index += feed2 (fd, A+index, B+index, BF );            state = 1;            break;                    case 4: /* A */            strcpy ( message, "A  " );            if ( index + BF >= stop )                index += feed (fd, A+index, stop-index ),                state++;            else                index += feed (fd, A+index, BF );            break;        case 5: /* B */            strcpy ( message, "  B" );            if ( index + BF >= stop )                index += feed (fd, B+index, stop-index ),                state--;            else                index += feed (fd, B+index, BF );            break;        case 6: /* X */            strcpy ( message, " X " );            if ( index + BF >= stop )                index += feed (fd, (rnd ? B : A)+index, stop-index ),                state++;            else                index += feed (fd, (rnd ? B : A)+index, BF );            break;        case 7: /* !X */            strcpy ( message, "!X " );            if ( index + BF >= stop )                index += feed (fd, (rnd ? A : B)+index, stop-index ),                state--;            else                index += feed (fd, (rnd ? A : B)+index, BF );            break;        case 8:            if ( index + BF/2 >= stop )                index += feed2 (fd, A+index, B+index, stop-index );            else                index += feed2 (fd, A+index, B+index, BF/2 );            Message ( "  B", index, freq, start, stop );            if ( index + BF >= stop )                index += feed (fd, B+index, stop-index );            else                index += feed (fd, B+index, BF );            if ( index + BF/2 >= stop )                index += feed2 (fd, B+index, A+index, stop-index );            else                index += feed2 (fd, B+index, A+index, BF/2 );            Message ( "A  ", index, freq, start, stop );            if ( index + BF >= stop )                index += feed (fd, A+index, stop-index );            else                index += feed (fd, A+index, BF );            break;        case 9: /* Liko */            if ( index + BF >= stop )                index += feedfac (fd, A+index, B+index, stop-index, fac1, fac2 );            else                index += feedfac (fd, A+index, B+index, BF        , fac1, fac2 );            break;                    default:            assert (0);        }        if (index >= stop)            index = start;        Message ( message, calc_true_index ( index, start, stop), freq, start, stop );    }}int  has_ext ( const char* name, const char* ext )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -