Проигрываем звук в SDL + конвертируем mp3 в wav в linux

Итак я уже рассказывал как создать окно и вставить в него текст или спрайт при помощи 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

Слушаем звук и радуемся.

Пример со звуком из скайпа. Надеюсь меня не посадят.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий