[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