📄 ndsound.cpp
字号:
#include <windows.h>
#include <mmsystem.h>
#include <dxerr8.h>
#include <dsound.h>
#include <math.h>
#include "DSUtil.h"
#include "NDsound.h"
#include "media.h"
#include "3dSound.h"
const DWORD DSOUND_3D_SOUND = 0x00000008; //3D音乐带有声音的X,Y,RANGE
CNDsound sound;
int CNDsound::init(HWND hWnd)
{
if(m_binitOK)
return 0;
m_hWnd = hWnd;
m_nMusicVolume=80;
m_nSoundVolume=80;
CoInitialize(NULL);
int nRet = Initialize( hWnd, DSSCL_NORMAL, 2, 22050, 16 );
switch(nRet)
{
case -1:
case -2:
case -3:
m_binitOK =0;
return nRet;
case S_OK:
m_binitOK = 1;
return 0;
}
return -1;
}
void CNDsound::Destroy()
{
if(!m_binitOK)
return;
DWORD i;
for(i=0; i< m_DequepSound.size();i++)
SAFE_DELETE( m_DequepSound[i]);
for(i=0;i<m_DequepMedia.size();i++)
SAFE_DELETE( m_DequepMedia[i]);
for(i=0;i<m_Dequep3DSound.size();i++)
SAFE_DELETE( m_Dequep3DSound[i]);
m_DequepSound.clear();
m_DequepMedia.clear();
m_Dequep3DSound.clear();
}
void CNDsound::Pause()
{
if(!m_binitOK)
return;
DWORD i;
for(i=0; i< m_DequepMedia.size();i++)
{
if(m_DequepMedia[i])
m_DequepMedia[i]->Pause();
}
for(i=0; i< m_DequepSound.size();i++)
{
if(m_DequepSound[i])
m_DequepSound[i]->Stop();
}
for(i=0; i< m_Dequep3DSound.size();i++)
{
if(m_Dequep3DSound[i])
m_Dequep3DSound[i]->Stop();
}
}
void CNDsound::Continue()
{
if(!m_binitOK)
return;
DWORD i;
for(i=0; i< m_DequepMedia.size();i++)
{
if(m_DequepMedia[i])
m_DequepMedia[i]->Pause();
}
for( i=0; i< m_DequepSound.size();i++)
{
if(m_DequepSound[i])
m_DequepSound[i]->Continue();
}
for( i=0; i< m_Dequep3DSound.size();i++)
{
if(m_Dequep3DSound[i])
m_Dequep3DSound[i]->Continue();
}
}
void CNDsound::SetMusicVolume(int nVolume)
{
if(!m_binitOK)
return;
m_nMusicVolume = nVolume;
DWORD i;
for(i=0; i< m_DequepMedia.size();i++)
{
if(m_DequepMedia[i])
m_DequepMedia[i]->SetVolume(nVolume);
}
}
void CNDsound::SetSoundVolume(int nVolume)
{
if(!m_binitOK)
return;
if(nVolume >100)
nVolume=100;
else
if(nVolume <0)
nVolume=0;
m_nSoundVolume = nVolume;
for(DWORD i=0; i< m_DequepSound.size();i++)
{
if(m_DequepSound[i])
m_DequepSound[i]->SetVolume(m_nSoundVolume);
}
for( i=0; i< m_Dequep3DSound.size();i++)
{
if(m_Dequep3DSound[i])
m_Dequep3DSound[i]->SetVolume(m_nSoundVolume);
}
}
BOOL CNDsound::CloseMedia(char *szFileName)
{
if(!m_binitOK)
return 0;
for(DWORD i = 0;i<m_DequepMedia.size();i++)
{
if(m_DequepSound[i])
{
if(strcmp(m_DequepMedia[i]->m_szFileName ,szFileName) == 0)
{
SAFE_DELETE( m_DequepMedia[i]);
m_DequepMedia.erase(m_DequepMedia.begin() + i);
return 1;
}
}
}
return 0;
}
void CNDsound::SetVolume(char *szFileName,int nVolume,int nWorldX ,int nWorldY)
{
if(!m_binitOK)
return ;
for(DWORD i=0; i< m_DequepSound.size();i++)
{
if(m_DequepSound[i])
{
if(strcmp(m_DequepSound[i]->m_szFileName ,szFileName) == 0)
if(nWorldX ||nWorldY)
{
if(m_DequepSound[i]->m_dwControl & DSOUND_3D_SOUND)
{
if(m_DequepSound[i]->m_nWorldX == nWorldX && m_DequepSound[i]->m_nWorldY == nWorldY)
{
m_DequepSound[i]->SetSelfVolume(nVolume) ;
m_DequepSound[i]->SetVolume(m_nSoundVolume);
return ;
}
}
}
else
{
m_DequepSound[i]->SetSelfVolume(nVolume) ;
m_DequepSound[i]->SetVolume(m_nSoundVolume);
return ;
}
}
}
}
BOOL CNDsound::CloseSound(char *szFileName,int nX,int nY)
{
if(!m_binitOK)
return 0;
for(DWORD i=0; i< m_DequepSound.size();i++)
{
if(m_DequepSound[i])
{
if(strcmp(m_DequepSound[i]->m_szFileName ,szFileName) == 0)
if(nX || nY)
{
if(m_DequepSound[i]->m_dwControl & DSOUND_3D_SOUND)
{
if(m_DequepSound[i]->m_nWorldX == nX && m_DequepSound[i]->m_nWorldY == nY)
{
SAFE_DELETE( m_DequepSound[i]);
m_DequepSound.erase(m_DequepSound.begin() + i);
return 1;
}
}
}
else
{
SAFE_DELETE( m_DequepSound[i]);
m_DequepSound.erase(m_DequepSound.begin() + i);
return 1;
}
}
}
return 0;
}
BOOL CNDsound::Close3DSound(char *szFileName,int nX,int nY)
{
if(!m_binitOK)
return 0;
for(DWORD i=0; i< m_Dequep3DSound.size();i++)
{
if(m_Dequep3DSound[i])
{
if(strcmp(m_Dequep3DSound[i]->m_szFileName ,szFileName) == 0)
if(m_Dequep3DSound[i]->GetWorldX() == nX && m_Dequep3DSound[i]->GetWorldZ() == nY)
{
SAFE_DELETE( m_Dequep3DSound[i]);
m_Dequep3DSound.erase(m_Dequep3DSound.begin() + i);
return 1;
}
}
}
return 0;
}
const CSound * CNDsound::GetSound(char *szFileName,int nX,int nY)
{
if(!m_binitOK)
return NULL;
for(DWORD i=0; i< m_DequepSound.size();i++)
{
if(m_DequepSound[i])
{
if(strcmp(m_DequepSound[i]->m_szFileName, szFileName) == 0)
if(nX || nY)
{
if(m_DequepSound[i]->m_dwControl & DSOUND_3D_SOUND)
{
if(m_DequepSound[i]->m_nWorldX == nX && m_DequepSound[i]->m_nWorldY == nY)
return m_DequepSound[i];
}
}
else
return m_DequepSound[i];
}
}
return NULL;
}
const C3DSound * CNDsound::Get3DSound(char *szFileName,int nX,int nY)
{
if(!m_binitOK)
return NULL;
for(DWORD i=0; i< m_Dequep3DSound.size();i++)
{
if(m_Dequep3DSound[i])
{
if(strcmp(m_Dequep3DSound[i]->m_szFileName, szFileName) == 0)
if(nX || nY)
if(m_Dequep3DSound[i]->GetWorldX() == nX && m_Dequep3DSound[i]->GetWorldZ() == nY)
return m_Dequep3DSound[i];
}
}
return NULL;
}
BOOL CNDsound::CloseSound(CSound *psound)
{
if(!m_binitOK)
return 0;
for(DWORD i=0; i< m_DequepSound.size();i++)
{
if(m_DequepSound[i])
if(m_DequepSound[i] == psound)
{
SAFE_DELETE( m_DequepSound[i]);
m_DequepSound.erase(m_DequepSound.begin() + i);
return 1;
}
}
return 0;
}
BOOL CNDsound::CloseSound(C3DSound *psound)
{
if(!m_binitOK)
return 0;
for(DWORD i=0; i< m_Dequep3DSound.size();i++)
{
if(m_Dequep3DSound[i])
if(m_Dequep3DSound[i] == psound)
{
SAFE_DELETE( m_Dequep3DSound[i]);
m_Dequep3DSound.erase(m_Dequep3DSound.begin() + i);
return 1;
}
}
return 0;
}
void CNDsound::SetSoundPos(CSound *psound ,int nX,int nY)
{
if(!m_binitOK)
return ;
for(DWORD i=0; i< m_DequepSound.size();i++)
{
if(m_DequepSound[i])
if(m_DequepSound[i] == psound)
{
psound->SetSoundPos(nX,nY,psound->m_nRange);
return ;
}
}
}
void CNDsound::SetSoundPos(C3DSound *psound,int nX,int nY,int nZ)
{
if(!m_binitOK)
return ;
for(DWORD i=0; i< m_Dequep3DSound.size();i++)
{
if(m_Dequep3DSound[i])
if(m_Dequep3DSound[i] == psound)
{
psound->ResetOrigPos(nX,nY,nZ);
return ;
}
}
}
CMedia *CNDsound::PlayMedia(HWND hwnd ,char * szFileName,int nLoop)
{
if(!m_binitOK)
return NULL;
CMedia * pMedia;
pMedia = new CMedia;
if(!pMedia->PlayMedia(hwnd,szFileName,nLoop))
return NULL;
pMedia->SetVolume(m_nMusicVolume);
m_DequepMedia.push_back(pMedia);
return pMedia;
}
C3DSound * CNDsound::Play3DSound(HWND hwnd,char *szFileName,int nWorldX ,int nWorldY,int nWorldZ,int nRange,int nLoop)
{
if(!m_binitOK)
return NULL;
if(!szFileName || strcmp(szFileName,"")==0)
return NULL;
for(int i=0; i< m_Dequep3DSound.size();i++)
{
if(m_Dequep3DSound[i]->m_dwSleepTime)
if(strcmp(m_Dequep3DSound[i]->m_szFileName,szFileName)==0)
{
m_Dequep3DSound[i]->RePlay(nWorldX,nWorldY,nWorldZ,nRange,nLoop);
return m_Dequep3DSound[i];
}
}
C3DSound *p3dSound = new C3DSound();
if(!p3dSound)
return NULL;
p3dSound->PlaySound(hwnd,szFileName,nWorldX,nWorldY,nWorldZ,nRange,nLoop);
m_Dequep3DSound.push_back(p3dSound);
return p3dSound;
}
CSound * CNDsound::PlaySound(char * szFileName,int nWorldX,int nWorldY,int nRange,int nLoop,int nVolume)
{
if(!m_binitOK)
return NULL;
if(!szFileName || strcmp(szFileName," ")==0)
return NULL;
int i;
char szExt[10];
for(i = strlen(szFileName) - 1;i>=0;i--)
{
if(szFileName[i] == '.')
strcpy(szExt,&szFileName[i]);
}
strupr(szExt);
if(strcmp(szExt,".WAV")!=0)
return NULL;// not wav file
if((m_nSoundVolume < 20 || nVolume < 20) && nLoop !=-1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -