OGG Vorbis + OpenAL
Модератор: Модераторы разделов
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
OGG Vorbis + OpenAL
Здравствуйте!
Кто-нибудь видел реализацию загрузки OGG файла в OpenAL(+-Alut) написанную на C? Я нашел одну реализацию, но там использовались векторы, а как их можно переписать на C, ума не приложу.
Кто-нибудь видел реализацию загрузки OGG файла в OpenAL(+-Alut) написанную на C? Я нашел одну реализацию, но там использовались векторы, а как их можно переписать на C, ума не приложу.
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: OGG Vorbis + OpenAL
Ну, std::vector<type> - это простой в использовании динамический массив.
Можно просто type* arr = (type*)malloc(sizeof(type)*n); использовать.
Можно просто type* arr = (type*)malloc(sizeof(type)*n); использовать.
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: OGG Vorbis + OpenAL
n чему равно?
sizeof(type)-?
Обычно NULL, когда что-то не так.
sizeof(type)-?
Обычно NULL, когда что-то не так.
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
Re: OGG Vorbis + OpenAL
//n чему равно?
Перед появлением NULL, там было написано что кол-во не известно. Смысл тогда использовать динамические массивы, если и так известно? Было бы там все изначально известно, проблем вообще не возникло.
Пробовал я константное значение делать, но я так и не въехал как эти векторы работают.
Вот сама функция:
Нужный кусок: buffer.insert(buffer.end(), array, array + bytes);
И как загружается файл:
Перед появлением 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
Так ведь в плюсах классы векторов реализуются, в конечном итоге, через malloc/realloc. Почему бы не сделать свой, сишный, вектор?
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: OGG Vorbis + OpenAL
в начале:
вместо buffer.insert(...):
Код: Выделить всё
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
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
функция:
вызывается:
Код: Выделить всё
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
Ничего не изменилось, ошибки те-же.
*buffer = realloc(*buffer, (*bufsize+bytes)*sizeof(char));
alBufferData(Buffer, format, &bufferData[0], (ALsizei)(bufferData.size()), freq);
Код: Выделить всё
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
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
NickLion писал(а): ↑19.07.2010 16:18BratSinot писал(а): ↑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 все моментально загрузилось.