-
[openAL] #7. 소리 재생 예제 만들기개발일지 2021. 10. 8. 16:40728x90
동영상 강의와 Guide를 토대로 아주 간단하게 사운드를 재생하는 예제를 만들어보았다.
버퍼에 사운드파일 정보를 입력하는 부분은 동영상강의를 참고했는데 계속 갖다 써야겠다.
position으로 이곳저곳 위치를 조절도 해보았다.
velocity는 왜인지 먹히지 않았고, 다음에는 stream으로 계속 위치가 바뀌도록 해봐야겠다.
#include <sndfile.h> #include <AL\alc.h> #include <AL\al.h> #include <AL\alext.h> #include <malloc.h> int main() { ALCdevice *device = alcOpenDevice(NULL); printf("Opened %s .\n", alcGetString(device, ALC_DEVICE_SPECIFIER)); ALCcontext* context = alcCreateContext(device, NULL); alcMakeContextCurrent(context); ALuint source; ALuint buffer; alGenSources(1, &source); alGenBuffers(1, &buffer); SF_INFO sf_info; SNDFILE* snd_file = sf_open("../sound/sci-fidrone.ogg",SFM_READ,&sf_info); ALuint format = AL_NONE; if (sf_info.channels == 1) format = AL_FORMAT_MONO16; else if (sf_info.channels == 2) format = AL_FORMAT_STEREO16; else if (sf_info.channels == 3) { if (sf_command(snd_file, SFC_WAVEX_GET_AMBISONIC, NULL, 0) == SF_AMBISONIC_B_FORMAT) format = AL_FORMAT_BFORMAT2D_16; } else if (sf_info.channels == 4) { if (sf_command(snd_file, SFC_WAVEX_GET_AMBISONIC, NULL, 0) == SF_AMBISONIC_B_FORMAT) format = AL_FORMAT_BFORMAT3D_16; } if (!format) { fprintf(stderr, "Unsupported channel count: %d\n", sf_info.channels); sf_close(snd_file); return 0; } short* membuf = static_cast<short*>(malloc((size_t)(sf_info.frames * sf_info.channels) * sizeof(short))); sf_count_t num_frames = sf_readf_short(snd_file, membuf, sf_info.frames); ALsizei num_bytes = (ALsizei)(num_frames * sf_info.channels) * (ALsizei)sizeof(short); alBufferData(buffer, format, membuf, num_bytes, sf_info.samplerate); free(membuf); sf_close(snd_file); alSourcei(source, AL_BUFFER, buffer); alSource3f(source, AL_POSITION, 0.f, 0.f, 10.f); alSourcePlay(source); ALint state = AL_PLAYING; while (state == AL_PLAYING && alGetError() == AL_NO_ERROR) { printf("Now playing...\n"); alGetSourcei(source, AL_SOURCE_STATE, &state); } alDeleteSources(1, &source); alDeleteBuffers(1, &buffer); alcMakeContextCurrent(NULL); alcDestroyContext(context); alcCloseDevice(device); return 0; }'개발일지' 카테고리의 다른 글
[openAL] #9. 여러 소리 재생시켜보기 (0) 2021.10.25 [openAL] #8. 방향키로 소리 움직이게 하기 (0) 2021.10.21 [openAL] #6. Guide 읽기 - 4 [에러 핸들링] (0) 2021.10.08 [openAL] #5. Guide 읽기 - 3 [소스 스트리밍 및 도플러 효과] (0) 2021.10.08 [openAL] #4. Guide 읽기 - 2 (0) 2021.10.07