09.15

신승빈·2022년 9월 15일
0

KGCA 수업

목록 보기
39/128

Sound

MS에서 지원하는 DirectXTK의 Audio를 사용하는 방법도 있지만 이번 수업에서는 fmod를 사용

Reference : https://github.com/microsoft/DirectXTK/wiki/DirectXTK
Reference : https://www.fmod.com/
참고 : Library를 DLL로 할 경우 dll파일을 소스코드 또는 실행파일과 같은 디렉토리에 있어야 함

채널

음향기기에 있어서 채널은 일반적으로 출력될 수 있는 스피커의 개수를 의미
모노, 스테레오, 5.1, 7.1 등은 출력할 수 있는 스피커의 개수를 의미하며, 이는 대부분 방향성을 띄고 있음

Reference : https://www.subangsa.com/afterguide/?q=YToyOntzOjEyOiJrZXl3b3JkX3R5cGUiO3M6MzoiYWxsIjtzOjQ6InBhZ2UiO2k6Mzt9&bmode=view&idx=7954375&t=board&category=43XQge1F11

FMOD에서 지칭하는 Channel은 1개의 Sound Stream을 Streaming하는 Socket같은 개념을 지칭

FMOD

#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같은 개념

FMOD::System의 해제

system->close();
system->release();

FMOD::System->update()

Load시 Sound파일을 모두 메모리에 올린다는 보장을 할 수 없음(Buffering)
일정 시간마다 update를 해줘야 Sound를 문제없이 지속적으로 Stream할 수 있음

FMOD::Channel

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;
}
profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글