LINUX.ORG.RU

OpenAL+MinGW32 - вывод звука под Windows не работает.


0

1

Под Linux следующий исходник работает без проблем:

/* Open and play WAV-file. */

#include <al.h>
#include <alc.h>

#include <stdlib.h>
#include <stdio.h>

#ifdef __WIN32__
#include <windows.h> /* Sleep() */
#else
#include <unistd.h>
#endif

ALfloat ListenerPos[] = {0.0, 0.0, 0.0};
ALfloat ListenerVel[] = {0.0, 0.0, 0.0};
ALfloat ListenerOri[] = {0.0, 0.0, -1.0, 0.0, 1.0, 0.0};

int main (int argc, char **argv) {

  ALCdevice *device;
  ALCcontext *context;
  char *filename;
  ALuint source;
  ALfloat mPos[3];
  ALfloat mVel[3];

  unsigned int buffer;
  ALvoid *_p;
  ALsizei _size;
  ALsizei _rate; /* sizei? */
  ALenum _format;
  ALboolean _loop;

  if (argc < 2) {
    printf ("Need arguments: [filename]\n");
    return 0;
  }
  filename = argv[1];

  /* Инициализировали устройство, default */
  /* либо строка с названием устройства */
  device = alcOpenDevice (NULL);
  if (!device) { printf ("Error opening device.\n"); return -1; }
  context = alcCreateContext (device, NULL);
  if (!context) { printf ("Error create context.\n"); return -1; }

  alcMakeContextCurrent (context);
  alListenerfv (AL_POSITION, ListenerPos);
  alListenerfv (AL_VELOCITY, ListenerVel);
  alListenerfv (AL_ORIENTATION, ListenerOri);

  alGenSources (1, &source);
  /* Тон звука; Усиление с расстоянием */
  alSourcef (source, AL_PITCH, 1.0f);
  alSourcef (source, AL_GAIN, 1.0f);
  alSourcefv (source, AL_POSITION, mPos);
  alSourcefv (source, AL_VELOCITY, mVel);
  /* Зациклен ли? */
  alSourcef (source, AL_LOOPING, 0);

  /* Загрузить данные */
  alGenBuffers (1, &buffer);
  alutLoadWAVFile ((ALbyte *) filename, &_format, &_p, &_size, &_rate, &_loop);
  alBufferData (buffer, _format, _p, _size, _rate);
  alutUnloadWAV (_format, _p, _size, _rate);
  alSourcei (source, AL_BUFFER, buffer);

  printf ("Ready.\n");
  alSourcePlay (source);
  ALint status;
  do {
    alutSleep (0.1f);
    alGetSourcei (source, AL_SOURCE_STATE, &status);
  } while (status == AL_PLAYING);
#ifdef __WIN32__
  Sleep (200);
#else
  usleep (1000*200);
#endif
  alSourceStop (source);

  alDeleteSources (1, &source);
  alDeleteBuffers (1, &buffer);

  alcMakeContextCurrent (NULL);
  alcDestroyContext (context);
  alcCloseDevice (device);
  printf ("Quit.\n");

  return 0;
}
Под Windows собираю так:
@ECHO OFF
SET NAME=alplay
C:\Dev-Cpp\bin\gcc.exe -O3 -Iinclude %NAME%.c -c -o _%NAME%.obj
C:\Dev-Cpp\bin\gcc.exe _%NAME%.obj -o _%NAME% OpenAL32.dll alut.dll
Запускаю:
_alplay.exe Message.wav
- не воспроизводит и «висит», ждет чего-то. Проверьте, пожалуйста (MinGW32, Windows). Почему не работает?

DLL'ки с includes брал здесь, http://connect.creativelabs.com/openal/Downloads/Forms/AllItems.aspx

★★★★★

Если висит - посмотрите в отладчике где именно. Может быть проблема в драйвере OpenAL или в самом alut. В качестве отладчика под MinGW рекомендую взять QtCreator.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

>>В качестве отладчика под MinGW рекомендую взять QtCreator С каких пор QtCreator стал отладчиком? Он имеет отладчик, но никак сам не является отладчиком. Эх, село!!!

anonymous
()
Ответ на: комментарий от Dendy

На некоторых машинах выдает что-то вроде: «Error opening device».

pacify ★★★★★
() автор топика
Ответ на: комментарий от Zenithar

OpenAL32.dll, alut.dll взяты именно оттуда.

pacify ★★★★★
() автор топика

Ошибку нашел в коде программы. Вот эти переменные:

  ALfloat mPos[3];
  ALfloat mVel[3];
- были неинициализированы. Поэтому источник звука мог находиться как угодно далеко.

pacify ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.