|
|
这个问题,搞好好几天了,还是搞不好,在有问题的一句里,我写了一条注释,//来到这里的时候就说内存错误了
编程实在是另人抓狂呀,好实说,有时候我觉得做掏屎工也比编程好,至少我可以知道每天能扫多少个屎坑,但编程不行呀,不能有计划,不能有目标,否则就等着发疯吧,本来我不想用directsound的,但不用又不能做混音,谁知道不学不知道,学了更不知道了
明明整个程序都懂了,但问题就是解决不了,那位好心人,帮忙看下吧,下辈子给您老做牛做马,这辈子就先记着帐吧。
#include "stdafx.h"
#include "resource.h"
//#include <windows.h> // include all the windows headers
//#include <windowsx.h> // include useful macros
#include "mmsystem.h" // very important and include WINMM.LIB too!
#include "ddraw.h"
#include "dsound.h"
//?办跑计??
HINSTANCE hInst;
HBITMAP hbmp;
HDC mdc,hDC;
HBITMAP hBitmap;
BITMAP bm;//用于临时取得一个位图的大小
HWND m_hWnd;//全局窗口备份
//LPDIRECTSOUND lpds;
//LPDIRECTSOUNDBUFFER lpdsb[5]; //配置五个音效指标
//ㄧΑ??
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void MyPaint(HDC hdc);
void jian_p(int wParam);
HRESULT result; //宣告HRESULT型变量,用于保存建立对象返回的变量
LPDIRECTSOUND pDS; //宣告DirectSound物件指标
LPDIRECTSOUNDBUFFER pPBuf; //宣告主缓冲区指标
LPDIRECTSOUNDBUFFER pSBuf[2]; //宣告次缓冲区
DSBUFFERDESC dsdesc; //宣告描述结构
int OnCreate();
LPDIRECTSOUNDBUFFER createbuffer(char* filename);
//****??Α**************************************
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
//磅︽??てㄧΑ
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
//???伴
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//****??の爹?跌怠摸?ㄧΑ*************************
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "canvas";
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
}
//****??ㄧΑ*************************************
// 1.?ミ?跌怠 DC ????拘砰 DC
// 2.?郎?更???瓜?匡ノ??拘砰 DC
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
HDC hdc;
hInst = hInstance;
hWnd = CreateWindow("canvas", "酶瓜跌怠" , WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
m_hWnd = hWnd;
MoveWindow(hWnd,10,10,600,450,true);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
/*hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
hbmp = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,600,450,LR_LOADFROMFILE);
SelectObject(mdc,hbmp);
MyPaint(hdc);
ReleaseDC(hWnd,hdc);*/
BITMAP bm;
/*HBITMAP hBitmap, hOldBmp; */
hDC = GetDC(hWnd);
hBitmap=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP2));
//hBitmap=LoadBitmap(hInstance,BmpName);
// 或用 hBitmap=LoadBitmap(hInstance,MAKEINTRESOURCE(BmpID));
//BmpName 是BMP在RC文件中定义的名称(字符串),可与盘上的BMP文件名不同
//BmpID 是BMP在RC文件中定义的标识符(WORD 型)
mdc=CreateCompatibleDC(hDC); //hDC 为屏幕窗口的DC
SelectObject(mdc, hBitmap);
//hOldBmp=(HBITMAP)SelectObject(hDCMem, hBitmap);
GetObject(hBitmap,sizeof(BITMAP), &bm);
BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, mdc, 0, 0, SRCCOPY);
pSBuf[0] = createbuffer("dyj.wav");
pSBuf[0]-> lay(0,0,1);
//PlaySound(MAKEINTRESOURCE(SOUND_ID_BJ1), hInstance, SND_RESOURCE | SND_SYNC);
return TRUE;
}
//****??酶瓜ㄧΑ*********************************
void MyPaint(HDC hdc)
{
BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY); //?瓜
}
//****????ㄧΑ***********************************
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_KEYDOWN:
jian_p(wParam);
break;
case WM_PAINT: //跌怠?酶??
hdc = BeginPaint(hWnd, &ps);
MyPaint(hdc);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY: //跌怠挡???
DeleteDC(mdc);
DeleteObject(hBitmap);
ReleaseDC(hWnd,hDC);
pSBuf[0]->Stop();
pSBuf[0]->Release();
pSBuf[1]->Release();
PostQuitMessage(0);
break;
default: //ㄤウ??
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
void jian_p(int wParam){
wParam = wParam - 48;
if(wParam == 1){
PlaySound(MAKEINTRESOURCE(SOUND_ID_BJ1), hInst, SND_RESOURCE | SND_ASYNC);
}else if(wParam == 2){
PlaySound(MAKEINTRESOURCE(SOUND_ID_BJ2), hInst, SND_RESOURCE | SND_ASYNC | SND_NOSTOP | SND_LOOP);
}else if(wParam == 3){
PlaySound(MAKEINTRESOURCE(SOUND_ID_BJ3), hInst, SND_RESOURCE | SND_SYNC);
}else if(wParam == 4){
PlaySound(MAKEINTRESOURCE(SOUND_ID_BJ4), hInst, SND_RESOURCE | SND_SYNC);
}else if(wParam == 5){
PlaySound(MAKEINTRESOURCE(SOUND_ID_BJ5), hInst, SND_RESOURCE | SND_SYNC);
}else if(wParam == 6){
PlaySound(MAKEINTRESOURCE(SOUND_ID_ZD), hInst, SND_RESOURCE | SND_ASYNC | SND_NOSTOP | SND_NOWAIT);
}else if(wParam == 7){
pSBuf[0]->Play(0,0,1); //播放背景音乐
}else if(wParam == 8){
}else if(wParam == 9){
}else if(wParam == 0){
//停止所有的声音
}
}
LPDIRECTSOUNDBUFFER createbuffer(char* filename)
{
HMMIO hmmio; //开启多媒体档案
MMRESULT mmresult; //传回结果
MMCKINFO ckRiff; //RIFF区块的资讯
MMCKINFO ckInfo; //子区块的资讯
DWORD size; //实际资料大小
LPVOID pAudio;
DWORD bytesAudio;
WAVEFORMATEX swfmt; //声音结构
//DSBUFFERDESC dsdesc; //描述结构
LPDIRECTSOUNDBUFFER buf;
LPDIRECTSOUNDBUFFER pbuf;
//DSBUFFERDESC dsdesc; //宣告描述结构
hmmio = mmioOpen(filename, NULL, MMIO_ALLOCBUF|MMIO_READ );
//开启档案
if(hmmio == NULL) //判断是否无效
MessageBox(m_hWnd, "档案不存在","错误",0);
ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
//设定档案类型
mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
//搜寻形态
if(mmresult != MMSYSERR_NOERROR)
MessageBox(m_hWnd, "档案格式错误!","错误",0);
ckInfo.ckid = mmioFOURCC('f','m','t',' '); //设定区块类型
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
//搜寻区块
if(mmresult != MMSYSERR_NOERROR)
MessageBox(m_hWnd, "档案模式错误!","错误",0);
if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1) //读取档案格式
MessageBox(m_hWnd, "读取档案格式失败!","错误",0);
mmresult = mmioAscend(hmmio,&ckInfo,0); //跳出子区块
ckInfo.ckid = mmioFOURCC('d','a','t','a'); //设定区块类型
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
//搜寻区块
if(mmresult != MMSYSERR_NOERROR)
MessageBox(m_hWnd, "档案格式错误!","错误",0);
size = ckInfo.cksize; //取得实际资料大小
memset( &dsdesc,0,sizeof(dsdesc)); //清空结构内容
dsdesc.dwSize = sizeof(dsdesc); //配置结构大小
dsdesc.dwFlags = DSBCAPS_STATIC |DSBCAPS_CTRLPAN |DSBCAPS_CTRLVOLUME| DSBCAPS_GLOBALFOCUS;
dsdesc.dwBufferBytes = size; //设定缓冲缓冲区大小
dsdesc.lpwfxFormat = &swfmt; //设定缓冲区格式
result = pDS->CreateSoundBuffer( &dsdesc, &pbuf, NULL );//来到这里的时候就说内存错误了
if(result != DS_OK)
MessageBox(m_hWnd, "建立次缓冲区失败!","错误",0);
result = pbuf->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);
//锁定缓冲区
if(result != DS_OK)
MessageBox(m_hWnd, "锁定缓冲区失败!","错误",0);
mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);
//读取音档资料
if(mmresult == -1)
MessageBox(m_hWnd, "读取音档资料失败!","错误",0);
result = pbuf->Unlock(pAudio,bytesAudio,NULL,NULL);
//解除锁定区
if(result != DS_OK)
/*MessageBox("解除锁定缓冲区失败!");*/
mmioClose(hmmio,0);
return pbuf;
}
int OnCreate()
{
WAVEFORMATEX pwfmt; //宣告声音结构
//DSBUFFERDESC dsdesc; //宣告描述结构
result = DirectSoundCreate( NULL, &pDS, NULL ); //建立DirectSound物件
if(result != DS_OK)
MessageBox(m_hWnd, "建立DirectSound物件失败","错误",0);
result = pDS->SetCooperativeLevel( m_hWnd, DSSCL_PRIORITY );
if(result != DS_OK)
MessageBox(m_hWnd, "设定协调层级失败","错误",0);
memset( &dsdesc,0, sizeof(dsdesc) ); //清空结构内容
dsdesc.dwSize = sizeof(dsdesc); //配置描述结构大小
dsdesc.dwFlags = DSBCAPS_PRIMARYBUFFER;
dsdesc.dwBufferBytes = 0;
dsdesc.lpwfxFormat = NULL;
result = pDS->CreateSoundBuffer( &dsdesc, &pPBuf, NULL );
if(result != DS_OK)
MessageBox(m_hWnd, "建立缓冲区失败","错误",0);
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)
MessageBox(m_hWnd, "设定播放格式失败","错误",0);
return 1;
}
|
|