Bien, el problema es que tanto en linux+gcc, win32+mingw (Dev-c++ y Code::blocks) funciona impecable la carga de un archivo de sonido Ogg.
Pero al compilar lo mismo en Visual C++ 2005 Express, sin errores (ni warnings graves), al ejecutar el programa que llama al cargador del ogg se cae (el tipico error de que la apliacación tuvo un problema y asdfsd).
modulo.h
Código:
class GD_Sonido3D
{
private:
FILE* oggFile; // file handle
OggVorbis_File oggStream; // stream handle
vorbis_info* vorbisInfo; // some formatting data
vorbis_comment* vorbisComment; // user comments
ALenum format; // internal format
vector < char > bufferData; // The sound buffer data from file
public:
//! Carga un sonido Ogg Vorbis
_GDT_EXPORT_ char CargarOGG(char *archivo);
}
modulo.cpp
Código:
char GD_Sonido3D::CargarOGG(char *archivo)
{
ALsizei freq; // The frequency of the sound data
// Create sound buffer and source
alGenBuffers(1, &SBuffer);
alGenSources(1, &SSource);
int endian = 0; // 0 for Little-Endian, 1 for Big-Endian
int bitStream;
long bytes;
char array[BUFFER_SIZE]; // Local fixed size array
FILE *f;
// Open for binary reading
f = fopen(archivo, "rb");
vorbis_info *pInfo;
OggVorbis_File oggFile;
ov_open(f, &oggFile, NULL, 0);
// Get some information about the OGG file
pInfo = ov_info(&oggFile, -1);
// Check the number of channels... always use 16-bit samples
if (pInfo->channels == 1)
format = AL_FORMAT_MONO16;
else
format = AL_FORMAT_STEREO16;
// end if
// The frequency of the sampling rate
freq = pInfo->rate;
do {
// Read up to a buffer's worth of decoded sound data
bytes = ov_read(&oggFile, array, BUFFER_SIZE, endian, 2, 1, &bitStream);
// Append to end of buffer
bufferData.insert(bufferData.end(), array, array + bytes);
} while (bytes > 0);
ov_clear(&oggFile);
// Upload sound data to buffer
alBufferData(SBuffer, format, &bufferData[0], static_cast < ALsizei > (bufferData.size()), freq);
// Attach sound buffer to source
alSourcei(SSource, AL_BUFFER, SBuffer);
printf("Cargado archivo OGG: %s\n", archivo);
return 'a';
}
Según pude lograr por descarte, es que se cae justo en la linea de ov_open().
No se a que puede deberse el error. La librería la compile yo mismo desde las fuentes con el mismo compilador.
Voy a intentar enlazar la misma liberia en version estática, pero no es la idea, quiero usar la version dinamica (dll).
* Los archivos fuente reales son mas largos, pero esta es la parte que realmente interesa, todas las propiedades están perfectamente declaradas y definidas, cmo dije, no tira errores, y los unicos warnings son porque marca fopen como "deprecated".