Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Воспроизведение mp3(mpg123) 
V
    Опции темы
cann
Дата 18.8.2010, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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);
}

PM MAIL   Вверх
cann
Дата 21.8.2010, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.8.2010

Репутация: нет
Всего: нет



Вопрос решен. Спасибо за помощь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1013 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.