[P&AM Lab] залежавшийся попугайчик

Илья Артеев ilyaart90 на rambler.ru
Вс Фев 20 21:52:54 MSK 2011


Григорий Александрович! сегодня наконец-то взялся и разобрался с 
попугайчиком, но только у него не работает эквалайзер, почему-то он его 
не выводит при проигровании семпла. а выкидывает только в конце.
это из-за того что stdout занят?
 вот первоначальный исходник, только я в нем вставил цикл при записи из 
буфера (write ( fd, p, n/100 ) ), чтобы читал по кускам ( по 400 байтов 
для вывода эквалайзера после каждого прохода)

#include <linux/soundcard.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

# define BUFSIZE 8000*10
#define SAMPLES 100

int main(int argc, char **argv){
    int res, arg, fd;
    unsigned char buffer[BUFSIZE];

    fd = open("/dev/dsp", O_RDWR);
    if (res == -1) {
        perror("can't /dev/dsp");
        exit(1);
    }
    arg = 1;
    printf("%d", fd);
    res = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
    if (res==-1){
        perror("failed SOUND_PCM_WRITE_CHANNELS");
        exit(1);
    }

    arg = 8;
    res = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
    if (res == -1) {
        perror("failed SOUND_PCM_WRITE_BITS");
        exit(1);
    }

    arg = 8000;
    res = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);

    if (res == -1) {
        perror("failed SOUND_PCM_WRITE_RATE");
        exit(1);
    }
    for (;;) {
        printf("\n \n");
        printf("press return the start...");
        gets(stdin);
        printf("recording... ");

        res = read(fd, buffer, sizeof(buffer)/2);
        if (res == -1)
            perror("failed reading /dev/dsp");
        if (res > 0) {
            unsigned char *p;
            unsigned int i, left, sval, n, cnt;
            float aver, max;
            char *eqline = 
"==============================================================";

            p = buffer;
            left = res;

            while (left) {
                n = left <= SAMPLES ? SAMPLES : left;
                aver = 0.0;
                max = 0.0;

                for ( i=0; i<SAMPLES; i++ ){
                    sval = abs(p[i]-128);
                    aver += sval;
                    max = sval > max ? sval : max;
                }

                aver /= n;
                cnt = (max/128)*strlen(eqline);

                for (i=0; i<100; i++){
                    res = write(fd, p, n/100);
                    p +=400;
                    printf("\033[2K");
                    printf("Average=%05.1f Max=%05.1f %s", aver, max, 
eqline+(strlen(eqline)-cnt));
                }

                fflush(stdout);

                if (res == -1)
                    perror("writing /dev/dsp failed");
                p += n;
                left -=n;
            }
        }
    }
    res = close(fd);
    if (res == -1){
        perror("failed close dev/dsp");
        exit(1);
    }
    return 0;
}
еще вопрос по поводу устройства /dev/dsp где можно узнать про флаги ( 
SOUND_PCM_WRITE_... ) да и вообще про сам dsp ?
и еще почему в define записали BUFSIZE 8000*10, а не 80000?




Подробная информация о списке рассылки Lab