Foros - Stratos

Programadores => Programación de audio => Mensaje iniciado por: CoLSoN2 en 08 de Diciembre de 2002, 03:58:22 AM

Título: Problemas con DirectSound
Publicado por: CoLSoN2 en 08 de Diciembre de 2002, 03:58:22 AM
                                Estoy haciendo un par de clases para manejar el tema de sonido, una de ellas es la siguiente, que se ocupa de la inicialización de DSound:



class DLLEXPORT W3C_SND_Audio

{

public:

IDirectMusicPerformance8 *m_pDAPerf;

IDirectMusicLoader8 *m_pDALoad;



~W3C_SND_Audio() { Shutdown(); }

bool Init(HWND hwnd);

void Shutdown();

};



y W3C_SND_Audio::Init se define así:



bool W3C_SND_Audio::Init(HWND hwnd)

{

CoInitialize(NULL);



if (CoCreateInstance(CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC,

 IID_IDirectMusicPerformance8,(void **)m_pDAPerf) != S_OK)

 return false;



if (CoCreateInstance(CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC,

 IID_IDirectMusicLoader8, (void **)m_pDALoad) != S_OK)

 return false;



if (FAILED(m_pDAPerf->InitAudio(NULL, NULL, hwnd, DMUS_APATH_SHARED_STEREOPLUSREVERB,

 64, DMUS_AUDIOF_ALL, NULL)))

 return false;



// buscamos nuestro directorio de sonido

char soundPath[MAX_PATH];

GetCurrentDirectory(MAX_PATH,soundPath);

strcat(soundPath,"sound");

// convertimos el path a unicode

WCHAR wSoundPath[MAX_PATH];

MultiByteToWideChar(CP_ACP,0,soundPath,-1,wSoundPath,MAX_PATH);

// lo indicamos como path de busqueda

if (FAILED(m_pDALoad->SetSearchDirectory(GUID_DirectMusicAllTypes,

 wSoundPath, false)))

 return false;



return true;

}



Pues bien, en esa función, en el primer CoCreateInstance, peta el programa. Si lo quito, petaen el segundo. Y si quito los dos, peta al intentar cargar luego algún sonido ya que DSound no está inicializado.

Si quito todo el tema de sonido va bien.

Alguien sabe qué pasa?

P.D: sorry ethernet pero no hay shot esta vez :___(                                
Título: Problemas con DirectSound
Publicado por: Juan Mellado en 08 de Diciembre de 2002, 10:59:57 PM
Hola Colson.

¿Podrías ser más concreto cuando dices que "peta"? Seguro que alguien se anima a ayudarte si eres más concreto. ¿Qué código de error te retorna?, ¿o no te retorna error, y se produce un error del sistema? ...

En fin, ... he pegado tu código en el compilador, y ha habido suerte, me ha "cantado" el error él solito al compilar. Falta un amspersand (&) en cada una de las llamadas a CoCreateInstance, delante de las variables m_pDAPerf y m_pDALoad:

 

  if (CoCreateInstance(CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC,

     IID_IDirectMusicPerformance8,(void **)&m_pDAPerf) != S_OK)

     return false;

   

  if (CoCreateInstance(CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC,

     IID_IDirectMusicLoader8, (void **)&m_pDALoad) != S_OK)

     return false;



¿Tienes los warnings habilitados? Si no los tienes, te recomiendo que los actives, que compiles con el nivel más alto. Pueden serte de mucha ayuda.

Saludos.
Título: Problemas con DirectSound
Publicado por: CoLSoN2 en 09 de Diciembre de 2002, 04:24:12 AM
                                si, era eso. ya lo habia solucionado.
con "petar" me refería a que simplemente termina la aplicación, sin mostrar ningún error.
y lo raro en mi caso es que no me advertiera de eso, teniendo los warnings habilitados. aunque eso sería un error y no un warning, ya que no puede castear de *TIPO a **TIPO (me lo ha mostrado otras veces XD)