Nuevo sistema auxiliar: Mixer

Con la necesidad de añadir sonido a nuestro motor gráfico, hemos creado un nuevo sistema auxiliar llamado CSystem_Mixer para encapsular la librería de OpenAL. El funcionamiento del sistema de sonido es bastante sencillo de cara al usuario: si un objeto necesita reproducir un sonido o una pieza musical, entonces deberá usar el componente CComponent_Audio_Source (que explicaré en próximos posts), y este hará uso de manera cómoda del sistema mencionado anteriormente, como en el siguiente esquema:

SAMSUNG

Para ello, se definirá el sistema con las siguientes características en el sistema:


class CSystem_Mixer: public CSystem
{
  friend class CComponent_Audio_Source;

  private:
    // Buffers reservados "one shots"...
    vector< ALuint > oneshot_used;
    vector< ALuint > oneshot_unused;

    // Buffers normales
    vector< ALuint > sources_used;
    vector< ALuint > sources_unused;

    uint NUMBER_SOURCES;
    uint NUMBER_SOURCES_ONESHOT;

    ALuint GetFreeSource();
    void AddFreeSource(ALuint source);

    ALuint GetFreeOneShot();

  public:
    CGameObject* listener;

  public:
    CSystem_Mixer(): CSystem() {};

    bool Init();
    void Close();

    void OnLoop();
};

Primero, se definen 4 vectores:

  • Vectores para sources o emisores de OpenAL que serán usados de manera continua, y se generarán un total de NUMBER_SOURCES (225 por defecto), cargadas de la variable __SOUND_NUMBER_SOURCES del sistema CSystem_Data_Storage. Se dfinirán dos vectores: sources ocupados o usados y sources sin usar. Si el mixer se queda sin sources, devuelve un error por consola.
  • Vectores para sources a los que hemos llamado OneShots, que consisten en sonidos que se se reproducirán una vez y se liberará una vez haya acabado, teniendo un total de  NUMBER_SOURCES_ONESHOT (30 por defecto), cargadas de la variable __SOUND_NUMBER_SOURCES_ONESHOT. Esto es ideal para sonidos cortos que se reproducen continuamente (explosiones, disparos…). Al igual que el anterior, se definen dos vectores: oneshots que están siendo usados y sin usar. Si se intenta emitir un sonido de este tipo y no quedan oneshots disponibles, se devuelve un error por consola. Si se prevee que no hay suficientes oneshots para una determinada instancia, se puede aumentar el número de oneshots cambiando la variable mencionada anteriormente, y los cambios se verán reflejados en la próxima vez que se llame a Init() del Mixer.
También, se definirá un único oyente por instancia para que funcione de manera correcta, que se encargará de recibir los sonidos cercanos y reproducirlos en función de su posición, orientación (no implementado) y velocidad (no implementado). Si no se especifica ninguno, se tomará como oyente a la cámara principal del sistema. Si no se ha definido ninguna cámara, entonces el sistema Mixer no funcionará. 
El objetivo del sistema es asignar sources normales a los componentes AudioSource que soliciten por medio de su método Bind() ocupar un source. Si se llama a Unbind() en dicho componente, se liberará el source que ocupa. De igual manera, hará algo similar con los oneshots, sólo que los componentes solicitarán reproducir un sonido de este tipo con PlayOneShot() (o con PlayAt(pos) (no implementado)), que el sistema Mixer comprobará en cada iteración si debe liberar el source o no, moviéndolo de un vector a otro.
Finalmente, el Mixer debe actualizar en cada iteración la posición del oyente de OpenAL con respecto a la de nuestro oyente o listener, además de actualizar la posición de los sources (no los oneshots) con las propiedades de transformación del objeto que contiene el componente AudioSource.
Advertisements

Vacaciones + Exámenes

Hemos tenido un largo periodo para descansar (dulces fiestas de navidad) y otro periodo aún más largo para estudiar para los exámenes, y por consiguiente, presentarnos a ellos.

Por supuesto, hemos tenido algo de tiempo libre para programar cosillas relacionadas con este proyecto. Pero, con pocas ganas de trabajar mucho, y pudiendo gastar el tiempo en cosas que nos “apetecen más”, habíamos decidido darle una pausa a este proyecto. Por supuesto, ahora que empieza el nuevo cuatrimestre, usaremos el tiempo que tengamos para trabajar en él, viendo el progreso que esperamos que tenga.

lazyprogrammer_gyxvv

Salud y buenas tardes.