Чтение вывода арекорда в C с помощью popen - PullRequest
0 голосов
/ 27 апреля 2018

Я попытался передать вывод arecord , используя c:

int main(int argc,char *argv[])
{    
    FILE* file = popen("arecord -r 8000 --format S32_LE -D plughw:0,0 -d 4", "r");
    long buffer[100];
    FILE *fp;
    fp=fopen("./record.dat", "w+"); 
    int i;

    for (i=0; i<40000; i++){
        fscanf(file, "%ld", &buffer[i%100]);
        fprintf(fp,"%d\t%ld\n", i , buffer[i%100] ) ; 
    }

    pclose(file);
    fclose(fp) ;

    FILE *p = popen(GNUPLOT,"w");
    fprintf(p,"plot 'record.dat' lt rgb 'red' title 'yeag' \n");
    fclose(p);

    return 0;
}

Я выбрал «long» из-за «подписанной 32-битной» спецификации в команде arecord. Тем не менее, gnuplot показывает мне глупость. Также программа завершается через миллисекунды, хотя я хочу записывать в течение 4 секунд. Что я делаю неправильно?

1 Ответ

0 голосов
/ 27 апреля 2018

похоже, что fscanf () для текста, а не для двоичного. Спасибо Пабло. Исправленная версия выглядит так:

int main(int argc,char *argv[]){    
    FILE* file = popen("arecord -q -t raw -r 8000 --format S32_LE -D plughw:0,0 -d 4", "r");
    int32_t buffer[100];
    FILE *fp;
    fp=fopen("./record.dat", "w+"); 
    int i,k,s;

    for (i=0; i<100; i++){
        fread(&buffer, sizeof(int32_t), 100,  file);
        for (k=0; k<100; k++){
            s = k + 100 * i;
            fprintf(fp,"%d\t%d\n", s , buffer[k] ) ; 
        }    

    }

    pclose(file);
    fclose(fp) ;

    FILE *p = popen(GNUPLOT,"w");
    fprintf(p, "set xrange [3000:3400]\n");
    fprintf(p,"plot 'record.dat' lt rgb 'red' title 'raw' \n");
    fclose(p);

    return 0;
}

, который возвращает красивый сюжет: волна

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...