Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/08/2007, 17:24
Avatar de ArrauKano
ArrauKano
 
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 22 años, 2 meses
Puntos: 4
Ogg-Vorbis, se cae en Visual C++ 2005 Express

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".
__________________
Blog | Tecnosquad