Проигрываем звук в 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

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

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

Просмотров:   2763

Комментарии

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Введи эти символы. Ато роботы одолели!