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 :___(
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.
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)