Итак я уже рассказывал как создать окно и вставить в него текст или спрайт при помощи SDL, теперь время пришло для встраивания звука (по пути следования расскажу ещё и о том, как конвертировать mp3 файл в wav).
Нам понадобится библиотечные файлы sdl. Установите пакеты SDL-devel и SDL_mixer-devel. В Fedora linux делается это так:
yum install SDL-devel SDL_mixer-devel
После чего приготовте текстовый редактор и wav файл. Если же у вас нет «вавки» можно взять mp3 и конвертануть..
Для этого установите утилиту mpg123:
yum install mpg123
После окончания установки перейдите в папку с необходимым файлом и выполните команду:
mpg123 -w fail.wav fail.mp3
Где:
- file.wav — выходной «вав» файл
- file.mp3 — исходный mp3
Теперь, когда всё готово, можно приступать к написанию программы.
В этом how to я не буду создавать окно. Ограничимся консольным вариантом.
Подключим необходимые библиотеки:
#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>
Выберем пространство имён. Пригодится для отслеживания ошибок («включаем» cout):
#include <iostream>
using namespace std;
И приступим к формированию главной функции программы:
int main(int argc, char **argv) {
Инициализируем SDL.
SDL_Init(SDL_INIT_AUDIO);
Теперь инициализируем mixer и сразу проверим на ошибки в єтом действии:
if (Mix_OpenAudio(22050, AUDIO_S16SYS, 2, 4096) < 0) {
cout << «mixer init error\n»;
return 1;
}
В случае ошибки функция вернёт -1.
Немного о параметрах:
int Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize);
- frequency — частота потока (нами задана стандартная) При не совпадении заданой частоты и частоты файла, звук будет спешить либо отставать…
- format — формат потока. Список ниже. У нас по стандарту.
- channels — количество выходных каналом.
- chunksize — размер каждого семпла. Если поставить слишком мало звук может не воспроизводится на старых машинах, если же — слишком много — звук может опережать действия. 4096 — золотая середина єтого параметра.
Список форматов. Думаю всё поймёте без перевода. Если нет пишите коменты..
- AUDIO_U8
- Unsigned 8-bit samples
- AUDIO_S8
- Signed 8-bit samples
- AUDIO_U16LSB
- Unsigned 16-bit samples, in little-endian byte order
- AUDIO_S16LSB
- Signed 16-bit samples, in little-endian byte order
- AUDIO_U16MSB
- Unsigned 16-bit samples, in big-endian byte order
- AUDIO_S16MSB
- Signed 16-bit samples, in big-endian byte order
- AUDIO_U16
- same as AUDIO_U16LSB (for backwards compatability probably)
- AUDIO_S16
- same as AUDIO_S16LSB (for backwards compatability probably)
- AUDIO_U16SYS
- Unsigned 16-bit samples, in system byte order
- AUDIO_S16SYS
- Signed 16-bit samples, in system byte order
После инициализации загрузим wav:
Mix_Chunk *sfx = Mix_LoadWAV(«main.wav»);
Воспроизводим его:
Mix_PlayChannel(-1, sfx, 0);
Первый параметр заставляет mixer самостоятельно выбрать канал (при указании -1).
Второй — wav который будем воспроизводить.
Третий — количество раз -1 которое будет воспроизведён звук. ( у нас 1 раз)
После всего этого делаем цикл ожидания событий:
SDL_Event event;
bool gameRunning = true;
while (gameRunning){
if (SDL_PollEvent(&event)){
if (event.type == SDL_QUIT){
gameRunning = false;
}
}
}
и выключаем включенное:
Mix_CloseAudio();
SDL_Quit();
return 0;
}
Можно компилировать:
g++ main.cpp -o main -lSDL -lSDL_mixer
Файл wav ложим в папку с бинарником и называем «main.wav». После этого запускаем main:
./main
Слушаем звук и радуемся.
Пример со звуком из скайпа. Надеюсь меня не посадят.