关于MFC下SetCooperativeLevel(m_hwnd,DSSCL_PRIORITY)函数调用失败的有关问题
关于MFC下SetCooperativeLevel(m_hwnd,DSSCL_PRIORITY)函数调用失败的问题
我现在在做一个实现三维音效的程序,是基于MFC的单文档框架,我只是在框架上增加了一个类Voice,用于播放声音和实现三维声效的。但是,在初始化directsound是调用SetCooperativeLevel(m_hwnd,DSSCL_PRIORITY)函数却失败了。我上网查了一下,觉得可能是m_hwnd传错了,因为开始我是在view中调用GetSafeHwnd()函数然后把它传递给m_hwnd的,后来我又试了一下,换为用App的句柄,也就是将AfxGetMainWnd()->GetSafeHwnd()传递给m_hwnd,结果还是一样。不知哪位高手能帮我解决一下这个问题?非常感激!
附注:
初始化directsound的代码如下:
我现在在做一个实现三维音效的程序,是基于MFC的单文档框架,我只是在框架上增加了一个类Voice,用于播放声音和实现三维声效的。但是,在初始化directsound是调用SetCooperativeLevel(m_hwnd,DSSCL_PRIORITY)函数却失败了。我上网查了一下,觉得可能是m_hwnd传错了,因为开始我是在view中调用GetSafeHwnd()函数然后把它传递给m_hwnd的,后来我又试了一下,换为用App的句柄,也就是将AfxGetMainWnd()->GetSafeHwnd()传递给m_hwnd,结果还是一样。不知哪位高手能帮我解决一下这个问题?非常感激!
附注:
初始化directsound的代码如下:
- C/C++ code
int Voice::InitPlayVoice(char* FileName) { result = DirectSoundCreate( NULL, &pDS, NULL ); //建立DirectSound对象 if(result != DS_OK) AfxMessageBox("建立DirectSound对象失败!"); result = pDS->SetCooperativeLevel( m_hWnd, DSSCL_PRIORITY ); //设定协调层级 if(result != DS_OK) AfxMessageBox("设定程序协调层级失败!"); memset( &dsdesc,0, sizeof(dsdesc) ); //清空结构内容 dsdesc.dwSize = sizeof(dsdesc); //配置描述结构大小 dsdesc.dwFlags = DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRL3D; dsdesc.dwBufferBytes = 0; dsdesc.lpwfxFormat = NULL; result = pDS->CreateSoundBuffer( &dsdesc, &pPBuf, NULL ); if(result != DS_OK) AfxMessageBox("建立主缓冲区失败!"); memset( &pwfmt,0, sizeof(pwfmt) ); pwfmt.wFormatTag = WAVE_FORMAT_PCM; pwfmt.nChannels = 2; //播放声道 pwfmt.nSamplesPerSec = 44100; //播放频率 pwfmt.wBitsPerSample = 16; //位 pwfmt.nBlockAlign = pwfmt.wBitsPerSample / 8 * pwfmt.nChannels; pwfmt.nAvgBytesPerSec = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign; result = pPBuf->SetFormat(&pwfmt); //设定播放格式 if(result != DS_OK) AfxMessageBox("设定播放格式失败!"); result = pPBuf->QueryInterface( IID_IDirectSound3DListener,(VOID**)&Listener ); if(result != DS_OK) AfxMessageBox("建立倾听者失败!"); pPBuf->Release(); hmmio = mmioOpen(FileName, NULL, MMIO_ALLOCBUF|MMIO_READ ); //打开文件 if(hmmio == NULL) //判断是否为空 AfxMessageBox("文件不存在"); ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E'); //设定文件类型 mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF); //搜索类型 if(mmresult != MMSYSERR_NOERROR) AfxMessageBox("文件格式错误!"); ckInfo.ckid = mmioFOURCC('f','m','t',' '); //设定区块类型 mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK); //搜索区块 if(mmresult != MMSYSERR_NOERROR) AfxMessageBox("文件格式错误!"); if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1) AfxMessageBox("读取格式失败!"); mmresult = mmioAscend(hmmio,&ckInfo,0); //跳出子区块 ckInfo.ckid = mmioFOURCC('d','a','t','a'); //设定区块类型 mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK); //搜索区块 if(mmresult != MMSYSERR_NOERROR) AfxMessageBox("文件格式错误!"); size = ckInfo.cksize; //获得实际资料大小 memset( &dsdesc,0,sizeof(dsdesc)); //清空结构内容 dsdesc.dwSize = sizeof(dsdesc); //配置描述结构大小 dsdesc.dwFlags = DSBCAPS_STATIC |DSBCAPS_CTRLPAN |DSBCAPS_CTRLVOLUME| DSBCAPS_GLOBALFOCUS|DSBCAPS_CTRL3D; dsdesc.dwBufferBytes = size; dsdesc.lpwfxFormat = &swfmt; result = pDS->CreateSoundBuffer( &dsdesc, &pSBuf, NULL ); if(result != DS_OK) AfxMessageBox("建立次缓冲区失败!"); result = pSBuf->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL); //锁定缓冲区 if(result != DS_OK) AfxMessageBox("锁定缓冲区失败!"); mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio); //读取声音文件资料 if(mmresult == -1) AfxMessageBox("读取声音文件资料失败!"); result = pSBuf->Unlock(pAudio,bytesAudio,NULL,NULL); //解除锁定缓冲区 if(result != DS_OK) AfxMessageBox("解除锁定缓冲区失败!"); mmioClose(hmmio,0); result = pSBuf->QueryInterface( IID_IDirectSound3DBuffer, (VOID**)&Buffer3D ); if(result != DS_OK) AfxMessageBox("建立3D缓冲区失败!"); // TODO: Add your specialized creation code here return 0; }