MS에서 지원하는 DirectXTK의 Audio를 사용하는 방법도 있지만 이번 수업에서는 fmod를 사용
음향기기에 있어서 채널은 일반적으로 출력될 수 있는 스피커의 개수를 의미
모노, 스테레오, 5.1, 7.1 등은 출력할 수 있는 스피커의 개수를 의미하며, 이는 대부분 방향성을 띄고 있음
FMOD에서 지칭하는 Channel은 1개의 Sound Stream을 Streaming하는 Socket같은 개념을 지칭
#pragma comment (lib, "fmode_vc.lib")
#include "fmod.h"
#include "fmod.hpp"
#include "fmode_errors.h"
FMOD::System* // DX의 Device같은 개념
FMOD::Sound* // 메모리에 올라간 Sound file(wav, mp3 등)
FMOD::Channel* // DX의 DeviceContext같은 개념
system->close();
system->release();
Load시 Sound파일을 모두 메모리에 올린다는 보장을 할 수 없음(Buffering)
일정 시간마다 update를 해줘야 Sound를 문제없이 지속적으로 Stream할 수 있음
Channel은 스마트 포인터로 관리되는 것으로 보이며, 따로 release해줄 필요 없음
이를 통해 Effect같은 경우 Stream개수에 신경쓰지 않고도 안정적으로 Stream 가능
Volume의 범위는 0 ~ 1 사이
#include <io.h>
void LoadDir(wstring path)
{
wstring dirpath = path + L"*.*";
intptr_t handle;
struct _wfinddata_t fd;
// 디렉토리에서 지정하는 파일을 검색하는 함수
handle = _wfindfirst(dirpath.c_str(), &fd);
if (handle == -1L) return;
do {
// 모든 디렉토리는 현재 위치와 상위 위치를 의미하는 '.', '..'이름의 "파일"을 갖음
if ((fd.attrib & _A_SUBDIR)
// 디렉토리 파일이지만 상위-현재를 가리키는 디렉토리 파일은 제외
&& fd.name[0] != '.')
{
// 하위 디렉토리일 경우 재귀호출
LoadDir(path + fd.name + L"/");
}
else if(fd.name[0] != '.')
{
m_fileList.push_back(path + fd.name);
}
}while(_wfindnext(handle,&fd)==0);
_findclose(handle);
}
#include <tchar.h>
wstring GetSplitName(std::wstring fullpath)
{
wstring name;
TCHAR dirve[MAX_PATH] = { 0, };
TCHAR dir[MAX_PATH] = { 0, };
TCHAR filename[MAX_PATH] = { 0, };
TCHAR ext[MAX_PATH] = { 0, };
_tsplitpath_s(fullpath.c_str(), dirve, dir, filename, ext);
name = filename;
name += ext;
return name;
}