Новичок
Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.8.2010
Репутация: нет Всего: нет
|
Пытаюсь написать программку воспроизведение mp3 формата под линукс. Для этой цели использую библиотеку декодирования mpg123. Аудио файл программка проигрывает, т.е. в наушниках музыку слышно, но с большим посторонем шумом и помехами. Вопрос, собственно, вот в чем: почему музыка слышна с шумом и что исправить в коде, чтоб получить чистое звучание музыки в формате mp3? Или подскажите куда копать, чтоб исправить описаное выше? Сам код программки: Код | #include <mpg123.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <sys/soundcard.h> #include <stdio.h>
/* * */ int main(int argc, char** argv) {
mpg123_handle* m; int ret; ssize_t len; const int inbuf = 16384; const int outbuf = 32768;
unsigned char buf[inbuf]; unsigned char out[outbuf];
size_t in = 0, outc = 0; size_t size;
//const char** l;
if(argc < 2) { fprintf(stderr, "Command: %s filename...\n", argv[0]);
return EXIT_SUCCESS; }
mpg123_init();
/** *** l = mpg123_decoders();
for(int i=0; l[i]!='\0'; i++) { printf("%d - %s\n", i, l[i]); } *** **/
m = mpg123_new(NULL, &ret);
if(m == NULL) { fprintf(stderr, "Unable to create mpg123 handle: %s\n", mpg123_plain_strerror(ret));
return EXIT_FAILURE; }
mpg123_param(m, MPG123_VERBOSE, 2, 0);
mpg123_open_feed(m);
if(m == NULL) { return EXIT_FAILURE; }
int in_fd; int audio_fd,format;
audio_fd = open("/dev/dsp", O_WRONLY); format = AFMT_U8;
ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format); if(format != AFMT_U8) { fprintf(stderr, "Error: format not suppoted...\n"); return EXIT_FAILURE; }
int nchans = 2;
ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &nchans);
int rate = 44100;
ioctl(audio_fd, SNDCTL_DSP_SPEED, &rate);
in_fd = open(argv[1], O_RDONLY);
fprintf(stderr, "Loop decoding...\n");
while(1) { len = read(in_fd, buf, inbuf);
if(len <= 0) { fprintf(stderr, "Input data end.\n"); break; } in += len;
ret = mpg123_decode(m, buf, len, out, outbuf, &size);
if(ret == MPG123_NEW_FORMAT) { long rate; int channels, enc;
mpg123_getformat(m, &rate, &channels, &enc);
fprintf(stderr, "New format: %li Hz rate, %i channels, encoding value %i\n", rate, channels, enc); }
write(audio_fd, out, size); outc += size;
while(ret != MPG123_ERR && ret != MPG123_NEED_MORE) { ret = mpg123_decode(m, NULL, 0, out, outbuf, &size); write(audio_fd, out, size); outc += size; } if(ret == MPG123_ERR) { fprintf(stderr, "some error: %s\n", mpg123_strerror(m)); break; } }
fprintf(stderr, "%lu bytes in, %lu bytes out\n", (unsigned long)in, (unsigned long)outc);
close(audio_fd); close(in_fd); mpg123_delete(m); mpg123_exit(); return (EXIT_SUCCESS); }
|
|