[SDL] SDL_mixer Audio - SDL 믹서 오디오
C, C++ 2024. 1. 24. 19:32 |SDL 기본 라이브러리는 WAV 형식의 오디오만 처리할 수 있다. mp3, ogg 등의 형식을 처리하기 위해서는 SDL_mixer 라이브러리가 필요하다.
우선 SDL 기본 라이브러리로 WAV 사운드를 출력해 보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#include <iostream>
#include "SDL.h"
#pragma comment(lib, "sdl2.lib")
#pragma comment(lib, "sdl2main.lib")
int main(int argc, char* argv[]) {
SDL_Init(SDL_INIT_AUDIO);
SDL_AudioSpec wav_spec;
Uint8* wav_buffer;
Uint32 wav_length;
if (SDL_LoadWAV("sound.wav", &wav_spec, &wav_buffer, &wav_length) == NULL) {
// Use this function to load a WAVE from a file.
printf("SDL_LoadWAV Error: %s\n", SDL_GetError());
return -1;
}
int bitDepth = SDL_AUDIO_BITSIZE(wav_spec.format);
int bytesPerSecond = (bitDepth * wav_spec.channels * wav_spec.freq) / 8;
float durationSec = (float)wav_length / bytesPerSecond;
printf("Duration: %f\n", durationSec);
// wav 파일 재생 시간 구하기.
SDL_AudioDeviceID dev = SDL_OpenAudioDevice(NULL, 0, &wav_spec, NULL, 0);
// Open a specific audio device.
if (dev == NULL) {
printf("SDL_AudioDeviceID Error: %s\n", SDL_GetError());
return -1;
}
if (SDL_QueueAudio(dev, wav_buffer, wav_length) != 0) {
// Queue more audio on non-callback devices.
printf("SDL_QueueAudio Error: %s\n", SDL_GetError());
return -1;
}
SDL_PauseAudioDevice(dev, 0);
// Use this function to pause and unpause audio playback on a specified device.
// dev: a device opened by SDL_OpenAudioDevice()
// pause_on: non-zero to pause, 0 to unpause
SDL_Delay(durationSec * 1000);
// Wait a specified number of milliseconds before returning.
SDL_FreeWAV(wav_buffer);
// Free data previously allocated with SDL_LoadWAV() or SDL_LoadWAV_RW().
SDL_CloseAudioDevice(dev);
//Use this function to shut down audio processing and close the audio device.
SDL_Quit();
return 0;
}
|
코드를 작성하고 빌드한다.
※ 참고
이번엔 SDL_mixer를 이용해 mp3, ogg 등의 사운드를 출력해 보자. 아래 링크에서 SDL_mixer를 다운받고 적당히 설치한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#include <iostream>
#include "SDL.h"
#include "SDL_mixer.h"
#pragma comment(lib, "sdl2.lib")
#pragma comment(lib, "sdl2main.lib")
#pragma comment(lib, "sdl2_mixer.lib")
int main(int argc, char* argv[]) {
SDL_Init(SDL_INIT_AUDIO);
if (Mix_OpenAudio(48000, MIX_DEFAULT_FORMAT, 2, 2048) != 0) {
// Open the default audio device for playback.
printf("Mix_OpenAudio Error: %s\n", Mix_GetError());
return -1;
}
Mix_Music* music = Mix_LoadMUS("sound.mp3");
// Load a supported audio format into a music object.
if (music == NULL) {
printf("Mix_LoadMUS Error: %s\n", Mix_GetError());
return -1;
}
printf("Duration: %f\n", Mix_MusicDuration(music));
// Get a music object's duration, in seconds.
Mix_PlayMusic(music, 0);
// Play a new music object. (0 means "play once and stop")
SDL_Delay(int(Mix_MusicDuration(music) * 1000));
Mix_FreeMusic(music);
// Free a music object. If this music is currently playing,
// it will be stopped.
Mix_CloseAudio();
// Close the mixer, halting all playing audio.
SDL_Quit();
return 0;
}
|
코드를 작성하고 빌드한다.
※ 참고
'C, C++' 카테고리의 다른 글
[SDL] SDL Dear ImGui Project - SDL Dear ImGui SDL 프로젝트 (1) | 2024.01.26 |
---|---|
[SDL] Dear ImGui SDL Renderer Examples - Dear ImGui SDL 렌더러 예제 (0) | 2024.01.25 |
[SDL] SDL Image Color Key - SDL 이미지 컬러키 (0) | 2024.01.24 |
[SDL] SDL_image Image Rendering - SDL 이미지 렌더링 (0) | 2024.01.23 |
[SDL] SDL_ttf Font Rendering - SDL 텍스트 폰트 렌더링 (1) | 2024.01.23 |