DirectSound와 mmio 함수를 섞어서 사용해봤습니다.
글쓴이: mydream / 작성시간: 화, 2015/12/08 - 4:01오후
msgBack.wav 파일을 재생하기 위해 다음과 같이 코드를 작성해봤습니다. 그런데 재생이 잘 안됩니다.
#include <windows.h>
#include <tchar.h>
#include "dsound.h"
#pragma comment(lib, "dsound.lib")
#include <Mmsystem.h>
#pragma comment(lib, "Winmm.lib")
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
//LoadLibrary(TEXT("Dsound3d.dll"));
WNDCLASS wndCls;
wndCls.cbClsExtra=0;
wndCls.cbWndExtra=0;
wndCls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndCls.hCursor=LoadCursor(NULL, IDC_ARROW);
wndCls.hIcon=NULL;
wndCls.hInstance=hInstance;
wndCls.lpfnWndProc=WinProc;
wndCls.lpszClassName=TEXT("test38888");
wndCls.lpszMenuName=NULL;
wndCls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndCls);
HWND hwnd=CreateWindow(wndCls.lpszClassName, TEXT("audio test"), WS_OVERLAPPEDWINDOW, 300, 300, 500, 500, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nShowCmd);
MSG message;
while( GetMessage(&message, NULL, 0, 0) ) {
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam;
}
BOOL CALLBACK DSEnumProc(LPGUID lpGUID, LPCTSTR lpszDesc, LPCTSTR lpszDrvName, LPVOID lpContext) {
HWND localHwnd=(HWND)lpContext;
TCHAR tmbuffer[1024];
lpGUID->Data1;
//MessageBox(localHwnd, TEXT("tututu"), NULL, MB_OK);
if(lpGUID!=NULL) {//pDsb->Play(0, 0, DSBPLAY_LOOPING); DSPLAY_LOOPING와 관련 있는 것으로 보임
LPDIRECTSOUND8 lpds;//typedef IDirectSound8 *LPDIRECTSOUND8
HRESULT hr=DirectSoundCreate8(NULL, &lpds, NULL);
//lpds->SetCooperativeLevel(localHwnd, DSSCL_PRIORITY);//2015.12.6, added
if(hr!=DS_OK) {
MessageBox(localHwnd, TEXT("DirectSoundCreate8 function failed."), NULL, MB_OK);
return FALSE;
}
//how to create IDirectSoundBuffer8
WAVEFORMATEX wfx;
memset(&wfx, 0, sizeof(WAVEFORMATEX));
wfx.wFormatTag=WAVE_FORMAT_PCM;
wfx.nChannels=2;
wfx.nSamplesPerSec=22050;
wfx.wBitsPerSample=16;
wfx.nBlockAlign=wfx.nChannels*wfx.wBitsPerSample/8;
wfx.nAvgBytesPerSec=wfx.nSamplesPerSec*wfx.nBlockAlign;
DSBUFFERDESC dsbdesc;
memset(&dsbdesc, 0, sizeof(DSBUFFERDESC));
dsbdesc.dwSize=sizeof(DSBUFFERDESC);
dsbdesc.dwFlags=DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY
| DSBCAPS_GLOBALFOCUS;
dsbdesc.dwBufferBytes=3*wfx.nAvgBytesPerSec;
dsbdesc.lpwfxFormat=&wfx;
LPDIRECTSOUNDBUFFER pDsb=NULL;//LPDIRECTSOUNDBUFFER
//LPDIRECTSOUNDBUFFER8 ppDsb8;
hr=lpds->CreateSoundBuffer(&dsbdesc, &pDsb, NULL);
//if( SUCCEEDED(hr) ) {
// hr=pDsb->QueryInterface(IID_IDirectSoundBuffer, (LPVOID*)&ppDsb8);//IID_IDirectSoundBuffer8
// pDsb->Release();
//}
HMMIO mhandle=mmioOpen( TEXT("MsgBack.wav"), NULL, MMIO_READ );
if(mhandle==NULL) { return 0; }
MMIOINFO mediaInfo;
CHAR buffer[1024];
if( mmioSetBuffer(mhandle, buffer, 1024, 0)!=0 ) {
MessageBox(localHwnd, TEXT("fefdf"), NULL, MB_OK);
mmioClose(mhandle, MMIO_FHOPEN);
return FALSE;
}
MessageBox(localHwnd, TEXT("DS_OK"), NULL, MB_OK);
MMRESULT mresult=mmioGetInfo(mhandle, &mediaInfo, 0);
if(mresult!=0) {
mmioClose(mhandle, MMIO_FHOPEN);
return FALSE;
}
LONG rbytes=mmioRead(mhandle, mediaInfo.pchNext, 1024);
VOID *pvdPtr1, *pvdPtr2;
DWORD first_bytes, second_bytes;
pDsb->Lock(0, mediaInfo.cchBuffer, &pvdPtr1, &first_bytes, &pvdPtr2, &second_bytes, 0);
pDsb->Play(0, 0, DSBPLAY_LOOPING);
TCHAR tmbuffer[1024];
_stprintf(tmbuffer, TEXT("%ld %p - %p"), mediaInfo.cchBuffer, mediaInfo.pchBuffer, mediaInfo.pchNext);
MessageBox(localHwnd, tmbuffer, NULL, MB_OK);
mmioClose(mhandle, MMIO_FHOPEN);
}
else {
_stprintf(tmbuffer, TEXT("lpszDesc %s lpszDrvName %s"), lpszDesc, lpszDrvName);
MessageBox(localHwnd, tmbuffer, NULL, MB_OK);
}
return TRUE;
}
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {
switch(message) {
case WM_CREATE:
if( FAILED( DirectSoundEnumerate( (LPDSENUMCALLBACK)DSEnumProc, (VOID*)hwnd ) ) ) {
return TRUE;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, message, wparam, lparam);
}어디를 고쳐야 소리가 출력될까요?
Forums:


참고해보세요.
http://www.codeproject.com/search.aspx?q=DirectSound&x=8&y=9&sbo=kw
http://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=DirectSound
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기