LINUX.ORG.RU

пишу wav-player


0

0

Хочу написать ПРОСТЕНЬКИЙ wav-player, желательно не юзая linux/soundcard.h и т. п. При попытке просто перенаправить поток байт из song.wav в /dev/dsp всё ну ОЧЕНЬ медленно играет. Вот пример: #include <stdio.h> FILE *dsp; FILE *wav; char cNewByte; int main(int argc, char *argv[]) { dsp=fopen("/dev/dsp", "w"); wav=fopen(argv[1], "r"); while(feof(wav)==0) { cNewByte=fgetc(wav); fputc(cNewByte, dsp); } fclose(dsp); fclose(wav); return 0; } Пробовал отправлять каждые 6 байт (6 ИМХО оптимальная скорость) но качество галимоеи к тому же МОНО. А как работают настоящие wav-плеера??? Если можете, напишите исходник.

anonymous

Re: пишу wav-player

Отключи буферизацию потока, или делай fflush(). Может поможет. И читать можно по 1024 байта за раз. Эффективней будет.

OxiD ★★★★ ()
Ответ на: Re: пишу wav-player от OxiD

Re: Re: пишу wav-player

не понял, брать сразу 1024 байта с помощью fgetc()
и к какому файлу применять fflush()?
у меня так получилось:

#include <stdio.h>
#include <cstdlib>
char *c;
long l;
FILE *wav;
FILE *dsp;
int main(int argc, char *argv[])
{
printf("\nStarting WAVE player...\n");
printf("\nChecking argc...\n");
if (argc<2) {
printf("\nwavplay [filename]\n");
exit(1);
}
printf("\nOpening wav file\n");
wav=fopen(argv[1], "r");
if (wav==NULL) {
printf("\nCan\'t open %s\n", argv[1]);
exit(2);
}
printf("\nOpening /dev/dsp...\n");
dsp=fopen("/dev/dsp", "w");
if (dsp==NULL) {
printf("\nCan\'t open /dev/dsp\n");
exit(3);
}
printf("\nStarting main loop...\n");
c=(char *)malloc((size_t)1024*sizeof(char));
/*c1=(char *)malloc((size_t)1024*sizeof(char));*/
while(feof(wav)==0) {
fgets(c,1024,wav);
fprintf(dsp,c);
fflush(dsp);
}
printf("\nClosing file %s...\n", argv[1]);
fclose(wav);
printf("\nClosing /dev/dsp...\n\n");
fclose(dsp);
return 0;
}


при применении fflush() к dsp звук пропадает.
А вообще всё шипит просто :(

anonymous ()
Ответ на: Re: Re: пишу wav-player от anonymous

Re: Re: Re: пишу wav-player

Ой, я описАлся,я имел ввиду не fgetc(), a fgets() =)))

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.