본문 바로가기

Programming/DirectX

[DirectSound] 7. 기본 재생 관련 소스

반응형

실제로 재생을 하기 위한 전체 소스입니다.

기존의 소스 코드를 취합하면 소리를 재생하는 것이 가능합니다.

먼저 MFC Application으로 프로젝트를 생성합니다.

프로젝트는 Dialog Based로 선택해서 생성합니다.

프로젝트 메뉴의 하위에 있는 Add Class를 선택합니다.

그리고 C++ Class를 선택하고 Add를 누릅니다.

Class name에 이름을 입력하면 파일명이 자동으로 생성됩니다.

원하는 클래스 이름으로 설정하고 Finish를 누르면 클래스 파일이 생성됩니다.

이제 재생을 위한 소스를 해당 클래스에 작성하면 됩니다.

기존의 내용을 토대로 작성하면 됩니다.

헤더의 내용은 다음과 같이 해서 재생과 중지를 추가하고 통지를 추가합니다.

#pragma once

#include <atlbase.h>
#include <memory>
#include <mmsystem.h>
#include <dsound.h>
#pragma comment(lib, "Winmm.lib")
#pragma comment(lib, "dsound.lib")

class CPGSoundPlayer
{
public:
	struct ArrayDeleter
	{
		template <class T>
		void operator()(T* p)
		{
			delete[] p;
		}
	};

public:
	CPGSoundPlayer();
	~CPGSoundPlayer();

public:
	// Create DirectSound Device Interface.
	int CreateDSound(HWND hWnd, LPCGUID deviceID = nullptr);

	// Read Wave File.
	int ReadWaveFile(LPTSTR szFileName);

	// Play Sound
	int PlayTheSound(HWND hWnd, UINT nMsgID, LPTSTR szWaveFile);

	// Stop Sound.
	void StopTheSound();

private:
	HRESULT CreateSoundBuffer();
	HRESULT SetNotification();
	static UINT WINAPI SoundCallback(LPVOID lpParam);

private:
	CComPtr<IDirectSound8> m_pDirectSound;
	CComPtr<IDirectSoundBuffer8> m_pDSoundBuffer;

	HANDLE m_hCallbackThread;
	HANDLE m_hCallbackEvent;
	BOOL m_bThreadEnd;

	// Wave Data
	WAVEFORMATEX m_wfx;
	DWORD m_nLength;
	std::tr1::shared_ptr<char> m_RawData;

	// Callback Message
	HWND m_hCallbackWnd;
	UINT m_nMsgID;	// After Playback, Send this MsgID to m_hCallbackWnd
};

버퍼의 통지에 대한 콜백이 추가되면서 내용이 늘어났습니다.

버퍼의 통지는 다음에 정리를 해서 올릴 예정입니다.

재생이 끝나면 버퍼의 통지가 발생하게 되고 윈도우에 전달해주는 것입니다.

일반적으로 재생과 중지 버튼은 한 개로 아이콘을 변경하면서 사용하는데 이럴 때 통지를 받으면 쉽게 구현이 됩니다.

전체 소스 코드는 아래 링크를 클릭하면 됩니다.

PGSoundPlayer.cpp


PGSoundPlayer.h


PlayerDemoDlg.cpp


PlayerDemoDlg.h

샘플 테스트를 위한 wav 파일은 다음 파일을 사용하면 됩니다.

기존의 소스 내용과 크게 다르지 않기 때문에 분석이 어렵지 않을 것입니다.

이것으로 기본적인 재생이 가능하게 됩니다.





반응형