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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PCM to RAW, Как конвертнуть PCM в RAW 
:(
    Опции темы
andrew_121
Дата 2.4.2008, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Доброго времени суток.
Уже несколько дней вожусь с алгоритмом декодирования PCM в RAW.
PCM следующего содержания: 8-bit PCM mono audio 8000 Hz
В alsaplayer нашел такой вариант:
Код

#define APLAY_FRAME_SIZE    4608

static int wav_play_frame(input_object *obj, char *buf)
{
    struct wav_local_data *data;        
    char audiobuf[8192];
    char tmpbuf[8192];
    unsigned char *us;
    short *s, *d, c;
    int i;
    
    if (!obj)
            return 0;
    data = (struct wav_local_data *)obj->local_data;
    if (!data) {
            return 0;
    }

    /* Take care of mono streams */
    if (obj->nr_channels == 1) { /* mono, so double  */
            if (data->format.bits == 8) { /* 8 bit */
                if (reader_read(tmpbuf, APLAY_FRAME_SIZE >> 2, data->wav_fd) != APLAY_FRAME_SIZE >> 2) {
                    return 0;
                }
#if 1        
                us = (unsigned char *)tmpbuf;
                d = (short *)audiobuf;
                for (i=0; i < APLAY_FRAME_SIZE; i+=4) {
                    *d++ = c = ((*us ^ 0x80) << 8) | *us;
                    us++;
                    *d++ = c;
                }
#endif
            } else { /* 16 bit */    
                if (reader_read(tmpbuf, APLAY_FRAME_SIZE >> 1, data->wav_fd) != APLAY_FRAME_SIZE >> 1) {
                        return 0;
                }
                s = (short *)tmpbuf;
                d = (short *)audiobuf;
                for (i=0; i < APLAY_FRAME_SIZE; i+=4) {
                        *d++ = *s;
                        *d++ = *s++; /* Copy twice */
                }
            }
    } else if (obj->nr_channels == 2) {
        if (reader_read(audiobuf, APLAY_FRAME_SIZE, data->wav_fd) != APLAY_FRAME_SIZE) {
                return 0;
        }
    } else {
            printf("Huh? More than 2 channels?\n");
            exit(3);
    }
    if (buf)
        memcpy(buf, audiobuf, APLAY_FRAME_SIZE);
    return 1;
}

Но получаеться бред какой-то на выходе. В чем трабла ?
И, кто-нибудь, обьясните что происходит в строке "*d++ = c = ((*us ^ 0x80) << 8) | *us;", не дружу с побитовыми операциями...
Заранее Спасибо.


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

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

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


 




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


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

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