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
댓글 달기