Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión

 
Búsqueda Avanzada

15.707 Mensajes en 3.130 Temas- por 371 Usuarios - Último usuario: lasfirrot
Mayo 18, 2012, 06:15:41
Foro de Hispabyte.netProgramaciónLenguajes y ProgramaciónDiseño y Programación de VideojuegosTema: Clase CAudio y CSound
Páginas: [1] 2   Ir Abajo
Imprimir
Autor Tema: Clase CAudio y CSound  (Leído 3876 veces)
0 Usuarios y 1 Visitante están viendo este tema.
NAT
Grupo_Moderadores
Experto
*
Mensajes: 415



Ver Perfil WWW
« : Noviembre 25, 2004, 10:28:49 »


Hola compa?eros, ya me he puesto manos a la obra con las clases, pero estoy teniendo problemas por desconocimiento m?o del entorno.

Zheo me he bajado el DevPack de la SDL y me da un error diciendome que no encuentra la librer?a SDL.dll (adjunto imagen), ademas no consigo linkar correctamente la librer?a SDL_mixer y tendr? que buscar por ah? como linkar dicha libre?a o encontrar alg?n devpack que me haga el trabajo (reitero que acabo de empezar con el Dev c++).

Si alguno puede echarme un cable o pasarme la configuraci?n de ambas librerias (como se linkan esas librer?as, si hace falta el archivo include...) se lo agradecr? eternamente (Estoy bastante acostumbrado a utilizar assemblys en C# y esto me supera Giñar)

Salu2 y gracias de antemano.

* Dibujo.JPG (12.01 KB - descargado 38 veces.)
« Última modificación: Noviembre 25, 2004, 10:35:38 por NAT » En línea

Para beber no hace falta divertirse... Giñar
Zheo
Grupo_Moderadores
Miembro Imprescindible
*
Mensajes: 1.408



Ver Perfil
« Respuesta #1 : Noviembre 25, 2004, 11:29:12 »

Ok, las dll las tienes que poner, o bien todas en un directorio y agragar ese directorio al path del sistema, o bien a?adirlas todasal directorio donde est? el ejecutable.

Dado que mi devpack pone las dlls en dev-cpp/dll ser? mucho m?s f?cil la primera opci?n:
Mi PC -> boton derechoe / propiedades / Opciones avanzadas / variables de entorno.
En las variables del sistema buscas PATH y a?ades un punto y coma y la ruta donde est?n las dlls, y ya est? ^^

Para linkar la biblioteca SDL mixer, vas a opciones de proyecto / par?metros y en linker, a?ades al final -lSDL_mixer
En línea
NAT
Grupo_Moderadores
Experto
*
Mensajes: 415



Ver Perfil WWW
« Respuesta #2 : Noviembre 25, 2004, 01:48:57 »

Siento ser un poco cazurro, pero soy as?:

He creado un directorio en C:\dll y he metido las librer?as de la SDL y la SDL_mixer.

En el path he agregado la ruta, he a?adido la l?nea -lSDL_mixer  y eston son los resultados:

Salu2.

 

* Dibujo.JPG (59.17 KB - descargado 51 veces.)
En línea

Para beber no hace falta divertirse... Giñar
NAT
Grupo_Moderadores
Experto
*
Mensajes: 415



Ver Perfil WWW
« Respuesta #3 : Noviembre 25, 2004, 01:53:06 »

Y el c?digo, tengo cargado tu Dev pack Zheo y funciona agregando el directorio al path, pero la SDL_mixer no hay manera.

Salu2.

* Wrapper_Audio.zip (4.88 KB - descargado 137 veces.)
En línea

Para beber no hace falta divertirse... Giñar
Zheo
Grupo_Moderadores
Miembro Imprescindible
*
Mensajes: 1.408



Ver Perfil
« Respuesta #4 : Noviembre 25, 2004, 02:15:43 »

recuerda que has de hacer un proyecto Dv-C++ de SDL

Lo que hace el proyecto de SDL es a?adir autom?ticamente los directorios de inlcude de SDL y a?adir al linker todas la bibliotecas que necesita SDL. Por ejemplo en la captura que me das s?lo linkas la SDL_mixer, y posiblemente necesitar? linkar con la SDL (libsdl.a creo que se llamaba)

Voy a mirar el c?digo ahora.
En línea
Zheo
Grupo_Moderadores
Miembro Imprescindible
*
Mensajes: 1.408



Ver Perfil
« Respuesta #5 : Noviembre 25, 2004, 02:53:13 »

Ok mir?ndolo por encima parece ser que CAudio simplemente inicializa el sistema.

Pues bien, vamos a cambiar una cosa. Como sistema de audio s?lo tenemos uno le aplicaremos el PD singleton para que s?lo exista una instancia, al igual que al sistema de video y de eventos.

Luego, el constructor en vez de inicializar el sistema dentro del mismo constructor, vamos a hacer que llamen a  una funci?n Init y que ?sta lo inicialice. Esto lo haremos para que as? nosotros podamos cambiar los par?metros del sistema en cualquier momento del desarrollo del programa.
He le?do la doc de SDL_Mixer por encima y parece que si llamas a Mix_OpenAudio() n veces, tienes tambi?n que llamar n veces a Mix_CloseAudio() para que el sistema se cierre. Eso si ir? en el destructor Sonrisa

Y si puedes contestarme a un par de preguntas:
- ?CSound o CMusic necesitan tener conocimiento de CAudio?. Es decir, ?en algun momento necesitan referenciar la clase CAudio para hacer una operaci?n?
- ?Existe un "volumen general"? Es decir algo que podamos llamar para que el volumen tanto del sonido como de la m?sica aumente o disminuya simult?neamente.

Un saludo.
En línea
NAT
Grupo_Moderadores
Experto
*
Mensajes: 415



Ver Perfil WWW
« Respuesta #6 : Noviembre 25, 2004, 03:01:05 »

Bueno ya he conseguido compilar el programa Giñar

Respondiendo a tus preguntas:

Yo creo que no necesitan saber nada de CAudio, aunque si podr?an preguntar si est? inicializada (Huh).

En cuanto a lo del volumen para la musica y el sonido son funciones diferentes Triste y no se como poder hacer que rule para las dos.

Una pregunta Zheo, sup?n que tengo esta estructura dentro de un proyecto

-caudio.h
-caudio.cpp (incluye caudio.h)
-csound.h
-csound.cpp (incluye csound.h)
-main.cpp

Como creo un objeto en main para hacer referencia a caudio??? Tengo que incliur tambien los includes???

Salu2.

PD: Perdona si mi preguntas son un poco obvias, pero es que no tengo ni warra Giñar
En línea

Para beber no hace falta divertirse... Giñar
Zheo
Grupo_Moderadores
Miembro Imprescindible
*
Mensajes: 1.408



Ver Perfil
« Respuesta #7 : Noviembre 25, 2004, 03:49:24 »

A ver, unas cosas. Se supone que cuando a?ades SDL_Wrapper.h autom?ticamente se inicializar?n todos los subsistemas que incluyamos en el wrapper, de momento video, audio, y eventos, de forma autom?tica.
B?sicamente lo que vamos a hacer son punteros a los subsistema. Si recordais, con el PD Singlet?n, s?lo podemos crear una instancia de un objeto con el m?todo Instance; pues lo que vamos a hacer es algo as?:
Omito espacios de nombres para mejor legibilidad
Código:
//Creamos un puntero a CScreen que ser? ?nico y representa a la pantalla
//Llamamos al m?todo Instance de esa manera tan peculiar porque es un m?todo est?tico.
//Autom?ticamente se inicializa el sistema de video si es necesario
CScreen * screen = CScreen::Instance();

//Creamos un puntero al gestor de eventos:
CEventSystem * eventSystem = CEventSystem::Instance();

//Y ahora un puntero al sistema de audio
CAudio * = CAudio::Instance();

Sin embargo, NAT, en tu c?digo, no tienes aplicado el PD, as? que para crear un objeto CAudio simplemente haces:

Código:
CAudio objetoCAudio( par?metros );
Espero que haya contestado a tu pregunta.

Lo del volumen simplemente se me hab?a ocurrido.
En principio se podr?a hacer llevando un registro de todos los objetos CSound y CMusic existentes, pero me parece algo inapropiado para lo que es el wrapper.
Eso se tendr?a que hacer en el c?digo del juego, donde s? que necesitaremos controlar los sonidos y m?sicas que utilicemos, claro Giñar pero en cualquier caso no
 
En línea
NAT
Grupo_Moderadores
Experto
*
Mensajes: 415



Ver Perfil WWW
« Respuesta #8 : Noviembre 25, 2004, 04:25:35 »

Bueno pues parece que ya me voy haciendo con ello, ya he conseguido escuchar 3 sonidos Giñar

Zheo necesito que me expliques lo del patr?n singleton para decuarlo a la clase CAudio si es necesario.

Mas preguntas, si creo un objeto del Tipo CSound sound("mi.wav");, como llamo a su destructor???

Saludos.
En línea

Para beber no hace falta divertirse... Giñar
NAT
Grupo_Moderadores
Experto
*
Mensajes: 415



Ver Perfil WWW
« Respuesta #9 : Noviembre 25, 2004, 04:56:58 »

Bueno aqu? pongo el c?digo de lo que llevo hasta ahora para que lo probeis y me digais si va por buen camino.

Sugerencias, aportaciones... son bien recibidas Giñar

Salu2.

* Pruebas.zip (345.35 KB - descargado 151 veces.)
En línea

Para beber no hace falta divertirse... Giñar
Zheo
Grupo_Moderadores
Miembro Imprescindible
*
Mensajes: 1.408



Ver Perfil
« Respuesta #10 : Noviembre 25, 2004, 06:24:28 »

A ver, a mi entender CAudio quedar?a m?s o menos as?:

caudio.h
Código:
#include "SDL_mixer.h"
#ifndef __SDL_WRAPPER_AUDIO_H__
#define __SDL_WRAPPER_AUDIO_H__

class CAudio{

        public:
        
        //
        void Init(int iFrequency, Uint16 iFormat, int iChannels, int iChunkSize);

        //
        void Close ();
        
        // Destructor de la clase CAudio
        ~CAudio();

        //
        static CAudio* Instance();


private:

         CAudio(){};

         CAudio(const CAudio & ori){};
        
         static CAudio* _ptrInstance;
};

#endif // __SDL_WRAPPER_AUDIO_H__

caudio.cpp
Código:
#include "caudio.h" // Cabecera de la clase

//inicializamos el puntero est?tico
CAudio::_ptrInstance = 0;

//inicializamos a cero el contador de instancias
CAudio::_iNumInstances = 0;

CAudio* CAudio::Instance(){
    
 if (_ptrInstance = 0)
    _ptrInstance = new CAudio();
    
 return _ptrInstance;    
}    

void CAudio::Init (int iFrequency, Uint16 iFormat, int iChannels, int iChunkSize){
    int iInit = Mix_OpenAudio(iFrequency, iFormat, iChannels, iChunkSize);
    _iNumInstances++;
}    

// Destructor de la clase CAudi
CAudio::~CAudio(){
     do{
     Close();  
     while (_iNumInstances != 0);
}    

void CAudio::CLose(){
     Mix_CloseAudio(void);  
     _iNumInstances--;
}    


Lo ?nico que no es del PD es lo de contar el n?mero de instancias, ya que, seg?n he le?do, si llamas m?s de una vez a MIX_OpenAudio() has de llamar el mismo n?mero de veces a MIX_CloseAudio(), de ah? el bucle final.
Hay otra manera de hacerlo, ya que la propia SDL_Mixer cuenta las veces que abres el sonido, y con una llamada a Mix_QuerySpec() puedes obtenerla. Sin embargo Mix_QuerySpec() toma 3 argumentos (y hay que pas?rselos porque son punteros y escribe en ellos) con lo que creo que es m?s eficiente y c?modo llevar nosotros la propia cuenta.
Mix_QuerySpec() lo usaremos para obtener informaci?n del sistema de audio Giñar

NAT el destructor NO se invoca. Si el objeto se crea en tiempo de compilaci?n, este se destruye cuando sale de ?mbito y se llama al destructor de forma impl?cita. Si t? creas un objeto en tiempo de ejecuci?n, con new tendr?s que borrarlo en alg?n momento con un delete y en ese momento se llama al destructor.

Dos ?ltimas cosas: usad los convenios del manual de estilo para hacer todo, comentarios nombres de variables y todo eso por favor. Los comentarios los puedo ir a?adiendo yo, pero el resto es demasaido.

Usad los strings de la stl siempre. Son m?s flexibles y adem?s podemos crear un string a partir de una cadena y obtener una cadena de un string.
En línea
Zheo
Grupo_Moderadores
Miembro Imprescindible
*
Mensajes: 1.408



Ver Perfil
« Respuesta #11 : Noviembre 25, 2004, 06:53:09 »

A ver, el dise?o UML que t? hiciste ya est? puesto en la p?gina. He cambiado algunos nombres de m?todos y sobre todo el de las variables para adecuarlo al manual de dise?o.

?chale un vistazo.

Por cierto he bajado tus pruebas y van muy bien, el sonido se oye perfecto Sonrisa Sonrisa Sonrisa
« Última modificación: Noviembre 25, 2004, 06:53:51 por Zheo » En línea
NAT
Grupo_Moderadores
Experto
*
Mensajes: 415



Ver Perfil WWW
« Respuesta #12 : Noviembre 26, 2004, 08:13:46 »

Wenos d?as compa?eros, Zheo he estado mirando el c?digo que has posteado, me podr?as explicar este m?todo:

Código:
static CAudio* Instance();

Otra cosilla, porque vamos a crear varias instancias de la clase CAudio???

Otra m?s, supongo que la variable ::_iNumInstances es est?tica??? es que no la has declarado Giñar

Saludos.
« Última modificación: Noviembre 26, 2004, 08:26:24 por NAT » En línea

Para beber no hace falta divertirse... Giñar
Zheo
Grupo_Moderadores
Miembro Imprescindible
*
Mensajes: 1.408



Ver Perfil
« Respuesta #13 : Noviembre 26, 2004, 04:47:50 »

Si, es est?tica, se me olvid? declararla. :blush:


Lo has entendido al rev?s Lengua no vamos a tener m?s de una instancia de CAudio, sino s?lamente una.
Por ejemplo, si el constructor de CAudio fuera p?blico podr?as hacer esto;
Código:
CAudio objeto1, objeto2;

y tendr?as dos instnacias de CAudio, y no queremos eso.

El m?todo est?tico CAudio::Instance() lo impide.
Es la ?nica manera de crear un objeto CAudio, ya que sus constructores son privados. Y dentro de CAudio::Instance() comprobamos si un objeto CAudio ha sido creado anteriormente, si es cierto devolvemos un puntero a ese objeto, y si no lo creamos antes de devolver el puntero.
Resumiendo, al llamar Instance por primera vez creamos el objeto y retornamos un puntero a ?l. Al llamarlo sucesivas veces retornamos el puntero a dicho objeto ya creado.

Esto se puede hacer por que CAudio::Instance() es un m?todo est?tico, los cuales tienen dos particularidades:
[li] No tienen puntero this impl?cito. (Si no sabeis lo que es eso da igual, no viene al caso)
[li] El m?todo existe siempre hayamos creado instancias de la clase o no; es decir, podemos llamar al m?todo aunque no hayamos creado ning?n objeto de esa clase cosa que no podr?amos hacer con un m?todo normal.

Aqu? es donde est? la clave. Esta segunda opci?n es la que nos da la ventaja de llamar a CAudio::Instance() siempre que queramos y, ojo al dato,  desde d?nde queramos es decir, siempre que hagamos CAudio::Instance(),  no importa desde qu? parte del c?digo, nos retornar? el puntero al ?nico objeto CAudio que podemos tener.

Es decir, tenemos resueltos dos problemas:
-Tener una ?nica instancia de un objeto que representa un subsistema
-Podemos acceder a la instancia del subsistema de forma global.

Espero que haya quedado un poco m?s claro, sino me lo decis que intentar? explicarme mejor Lengua
En línea
NAT
Grupo_Moderadores
Experto
*
Mensajes: 415



Ver Perfil WWW
« Respuesta #14 : Diciembre 01, 2004, 09:05:39 »

Aqu? estoy de nuevo Giñar

A ver si me podeis ayudar con esto:

Zheo, he creado la clase CAudio tal como me expusiste y tengo varios errores y dudas (Los errores del compilador los pongo en la imagen):

Ahora:

Código:
static CAudio *_ptrInstance;

Por que si es del tipo CAudio lo inicializas a 0???

Código:
//inicializamos el puntero est?tico
CAudio::_ptrInstance = 0;

A ver si me podeis echar un cablecillo que me he quedado atascado.

Salu2 y gracias de antemano.

* erroreswrapper.JPG (36.7 KB - descargado 50 veces.)
« Última modificación: Diciembre 01, 2004, 09:06:12 por NAT » En línea

Para beber no hace falta divertirse... Giñar
Páginas: [1] 2   Ir Arriba
Imprimir
Foro de Hispabyte.netProgramaciónLenguajes y ProgramaciónDiseño y Programación de VideojuegosTema: Clase CAudio y CSound
Ir a:  


Tema diseñado por RJ-45 para Hispabyte.net basado en el
theme famouspadexx v.09 designed by Formado Comprido
Downloable here. My present to padexx.de