OGG Vorbis + OpenAL

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

OGG Vorbis + OpenAL

Сообщение BratSinot »

Здравствуйте!

Кто-нибудь видел реализацию загрузки OGG файла в OpenAL(+-Alut) написанную на C? Я нашел одну реализацию, но там использовались векторы, а как их можно переписать на C, ума не приложу.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OGG Vorbis + OpenAL

Сообщение NickLion »

Ну, std::vector<type> - это простой в использовании динамический массив.
Можно просто type* arr = (type*)malloc(sizeof(type)*n); использовать.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: OGG Vorbis + OpenAL

Сообщение BratSinot »

NickLion писал(а):
18.07.2010 12:43
Ну, std::vector<type> - это простой в использовании динамический массив.
Можно просто type* arr = (type*)malloc(sizeof(type)*n); использовать.

NULL
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OGG Vorbis + OpenAL

Сообщение NickLion »

n чему равно?
sizeof(type)-?
Обычно NULL, когда что-то не так.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: OGG Vorbis + OpenAL

Сообщение BratSinot »

//n чему равно?
Перед появлением NULL, там было написано что кол-во не известно. Смысл тогда использовать динамические массивы, если и так известно? Было бы там все изначально известно, проблем вообще не возникло.
Пробовал я константное значение делать, но я так и не въехал как эти векторы работают.

Вот сама функция:

Код:

void oam::LoadOGG(char *fileName, vector<char> &buffer, ALenum &format, ALsizei &freq) { int endian=0, bitStream; long bytes; char array[BUFFER_SIZE]; FILE *f; f = fopen(fileName, "rb"); if (f == NULL) { fprintf(stderr, "Cannot open %s for reading...\n", fileName); exit(1); } vorbis_info *pInfo; OggVorbis_File oggFile; if (ov_open(f, &oggFile, NULL, 0) != 0) { fprintf(stderr, "Error opening %s for reading...\n", fileName); exit(1); } pInfo = ov_info(&oggFile, -1); if (pInfo->channels == 1) format = AL_FORMAT_MONO16; else format = AL_FORMAT_STEREO16; freq = pInfo->rate; do { bytes = ov_read(&oggFile, array, BUFFER_SIZE, endian, 2, 1, &bitStream); if (bytes < 0) { ov_clear(&oggFile); fprintf(stderr, "Error decoding %s...\n", fileName); exit(1); } buffer.insert(buffer.end(), array, array + bytes); } while (bytes > 0); ov_clear(&oggFile); }

Нужный кусок: buffer.insert(buffer.end(), array, array + bytes);

И как загружается файл:

Код:

vector<char> bufferData; LoadOGG(tmp, bufferData, format, freq); alBufferData(Buffer, format, &bufferData[0], static_cast<ALsizei>(bufferData.size()), freq);
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: OGG Vorbis + OpenAL

Сообщение eddy »

Так ведь в плюсах классы векторов реализуются, в конечном итоге, через malloc/realloc. Почему бы не сделать свой, сишный, вектор?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OGG Vorbis + OpenAL

Сообщение NickLion »

в начале:

Код: Выделить всё

char* buffer = NULL;
long bufsize = 0;

вместо buffer.insert(...):

Код: Выделить всё

buffer = realloc( buffer, ( bufsize + bytes ) * sizeof( char ) );
memcpy( buffer + bufsize, array, bytes * sizeof( char ) );
bufsize += bytes;
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: OGG Vorbis + OpenAL

Сообщение BratSinot »

NickLion писал(а):
18.07.2010 15:00
в начале:

Код: Выделить всё

char* buffer = NULL;
long bufsize = 0;


вместо buffer.insert(...):

Код: Выделить всё

buffer = realloc( buffer, ( bufsize + bytes ) * sizeof( char ) );
memcpy( buffer + bufsize, array, bytes * sizeof( char ) );
bufsize += bytes;

Блин, что куда вставлять? Что где изменить? Как этим пользоваться?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OGG Vorbis + OpenAL

Сообщение NickLion »

функция:

Код: Выделить всё

void oam__LoadOGG(char *fileName, char** buffer, long* bufsize, ALenum *format, ALsizei *freq)
{
 int endian=0, bitStream;
 long bytes;
 char array[BUFFER_SIZE];
 *buffer = NULL;
 *bufsize = 0;
 FILE *f;

 f = fopen(fileName, "rb");

 if (f == NULL)
 {
  fprintf(stderr, "Cannot open %s for reading...\n", fileName);
  exit(1);
 }

 vorbis_info *pInfo;
 OggVorbis_File oggFile;

 if (ov_open(f, &oggFile, NULL, 0) != 0)
 {
  fprintf(stderr, "Error opening %s for reading...\n", fileName);
  exit(1);
 }

 pInfo = ov_info(&oggFile, -1);

 if (pInfo->channels == 1) format = AL_FORMAT_MONO16;
 else format = AL_FORMAT_STEREO16;

 freq = pInfo->rate;

 do
 {
  bytes = ov_read(&oggFile, array, BUFFER_SIZE, endian, 2, 1, &bitStream);

  if (bytes < 0)
  {
   ov_clear(&oggFile);
   fprintf(stderr, "Error decoding %s...\n", fileName);
   exit(1);
  }

  //buffer.insert(buffer.end(), array, array + bytes);
  *buffer = realloc( *buffer, ( *bufsize + bytes ) * sizeof( char ) );
  memcpy( *buffer + *bufsize, array, bytes * sizeof( char ) );
  *bufsize += bytes;
 }
 while (bytes > 0);


 ov_clear(&oggFile);
}

вызывается:

Код: Выделить всё

char* bufferData;
long bufferDataSize;
oam__LoadOGG(tmp, &bufferData, &bufferDataSize, &format, &freq);
alBufferData(Buffer, format, &bufferData[0], (ALsizei) (bufferData.size()), freq);
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: OGG Vorbis + OpenAL

Сообщение BratSinot »

Ничего не изменилось, ошибки те-же.

Код: Выделить всё

audio.h:80:59 error: invalid conversion from 'void*' to 'char*'

*buffer = realloc(*buffer, (*bufsize+bytes)*sizeof(char));

Код: Выделить всё

audio.h:107:68 error:  request for member 'size' in 'bufferData', wich is non'class type 'char*'

alBufferData(Buffer, format, &bufferData[0], (ALsizei)(bufferData.size()), freq);
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OGG Vorbis + OpenAL

Сообщение NickLion »

BratSinot писал(а):
19.07.2010 16:03

Код: Выделить всё

audio.h:80:59 error: invalid conversion from 'void*' to 'char*'

*buffer = realloc(*buffer, (*bufsize+bytes)*sizeof(char));

*buffer = (char*)realloc(*buffer, (*bufsize+bytes)*sizeof(char));
ммм... разве не очевидно?

BratSinot писал(а):
19.07.2010 16:03

Код: Выделить всё

audio.h:107:68 error:  request for member 'size' in 'bufferData', wich is non'class type 'char*'

alBufferData(Buffer, format, &bufferData[0], (ALsizei)(bufferData.size()), freq);

alBufferData(Buffer, format, &bufferData[0], (ALsizei)bufferDataSize, freq);
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: OGG Vorbis + OpenAL

Сообщение BratSinot »

NickLion писал(а):
19.07.2010 16:18
BratSinot писал(а):
19.07.2010 16:03

Код: Выделить всё

audio.h:80:59 error: invalid conversion from 'void*' to 'char*'

*buffer = realloc(*buffer, (*bufsize+bytes)*sizeof(char));

*buffer = (char*)realloc(*buffer, (*bufsize+bytes)*sizeof(char));
ммм... разве не очевидно?

Нет, ибо я realloc не пользовался, и не видел прототип.

Не работает. Не проигрывается. Похоже как раз на месте загрузки застопорился. Процессор под 100%(ну у меня только на одно ядро), и память колеблется.

Хотя нет, оно работает, но с маленькими файлами. Короче, MinGW фуфло медленое. Собрал сейчас на своей Slackware64 13.1 GCC 4.5.1 все моментально загрузилось.
Спасибо сказали: