[Из песочницы] Простейший вывод звука с помощью библиотеки Audiere

Приветствую! Данная заметка ориентирована на начинающих программистов, самых, что ни на есть новичков. Она о простой библиотеке Audiere. Если вы когда-то хотели вывести звук просто и быстро, то Audiere вам скорее всего понравится!

Для начала расскажу немного о том, что это:

Audiere — это высокоуровневый аудио-API с открытым исходным кодом под лицензией LGPL. Его можно использовать во множестве языков, включая Java, C++, Python, Delphi и др. Разрешается использовать в коммерческих приложениях свободным образом, если исходный код не будет затронут (подробности в документации к библиотеке).

Подготовимся к реализации простейшего примера на C++:

  • Скачиваем библиотеку на оф.сайте (в моём случае — это Win32 Binary Release)
  • Традиционно переносим файл «audiere.lib» в папку «lib» компилятора, а заголовочник «audiere.h» также в папку «include» вашего компилятора
  • Создаём для примера консольный проект C++
  • В настройках линкера в проекте добавляем «audiere.lib»
  • Не забываем «audiere.dll» из папки «bin» положить рядом с исходниками нашего проекта, а затем и рядом с exe-файлом нашей программы.

Если совсем новичок
Если ты третий день, как научился выводить «cout<<», то заранее скажу, друг, просто повторяй, что написано внизу, я постараюсь всё объяснить.

  • Необходимо подключить заголовочные файлы:

#include  //нужен для вывода строк "cout<<"
#include "conio.h" //нужен намеренно для "getche()", а не "cin>>"
#include "windows.h" //библиотека audiere её требует
#include "audiere.h" //сама библиотека

using namespace std;
using namespace audiere; //подключаем пространства имён для более короткой записи

  • Далее главная функция:

int main()
{
setlocale(0, "Russian"); //пусть наша консоль говорит по-русски
cout<<"Простейшее воспроизведение звука"<play(); //проигрываем наш звук
getche(); //ждём нажатия любой клавиши прежде чем выйти из программы

}

Теперь, комментарии чуть более развернутые:
AudioDevicePtr device = OpenDevice();

Здесь мы создаем, по концепции библиотеки указатель device (не совсем явный, но всё же указатель). OpenDevice () можно оставить без аргументов, тогда библиотека сама выберет подходящее устройство.

Далее, открываем наш файл в поток:

OutputStreamPtr sound = OpenSound(device , "sound.wav" , false);

Открывая наш звук, в OpenSound нужно передать три аргумента:

1. device — устройство куда будет происходить вывод
2. «sound.wav» — наш произвольный звук
3. false или true — хотим мы, чтобы наш звук был загружен в память и воспроизведён (false) или, посредством потока (например, если это большой файл), воспроизводился не загружаясь полностью в память (true). Для саундтреков обязательно «true», иначе всю память займёт звук.

sound->play();

Проигрываем наш звук! Как видно, всё очень просто. Для звуков можно установить громкость:
sound->setVolume(1.0f); //полная громкость (для половинной "0.5f" соответственно)

Можно сделать звук повторяющимся (зацикленным):
sound->setRepeat(true);

Остановить воспроизведение данного потока:
sound->stop();

Узнать проигрывается ли данный поток сейчас:
sound->isPlaying();

Узнать текущую громкость у данного потока:
sound->getVolume();

Установить панораму звука (слева, по центру, справа):
sound->setPan(-1,0);//в данном случае установит звук на левый канал, 0.0 - установит посередине, а 1.0 справа

Установить скорость воспроизведения звука (тональность тоже меняется):
sound->setPitchShift(1.0);//нормальная скорость. Значения от 0.5 до 1.0 замедлят звук, а от 1.0 до 2.0 ускорят.

sound->getPitchShift();//узнать текущее значение PitchShift для потока

В заголовочном файле «audiere.h» определены ещё некоторые другие функции такие, как «CreateTone ();», «CreatePinkNoise ()» и прочие, включая MIDI-возможности. Список членов пространства имён «audiere», а заодно и ссылка на онлайн-документацию здесь.

Конечно же, в нашу программу ещё нужно добавить обработку ошибок, тогда исходный код будет выглядеть следующим образом:

AudioDevicePtr device  = OpenDevice();
if(!device)
{
cout<<"Ошибка открытия AudioDevice. Нажмите любую клавишу для выхода..";
getche();
return 0; //выходим из программы
}

А также обработка ошибки открытия файла:
if(!sound){
cout<<"Ошибка открытия файла! Для выхода нажмите любую клавишу..";
getche();
return 0;
}

Исходный код полностью
#include  //нужен для вывода строк "cout<<"
#include "conio.h" //нужен намеренно для "getche()" , а не "cin>>"
#include "windows.h" //библиотека audiere её требует
#include "audiere.h" //сама библиотека

using namespace std;
using namespace audiere; //определяем пространства имён для более короткой записи кода

int main()
{
setlocale(0, "Russian"); //пусть наша консоль говорит по-русски
cout<<"Простейшее воспроизведение звука"<play(); //проигрываем наш звук
getche(); //ждём нажатия любой клавиши прежде чем выйти из программы

}


И напоследок, программа по-интереснее: сделаем примитивный музыкальный инструмент!

В этот раз мы будем пользоваться методом «getch ()». Его отличие в том, что он работает также, как «getche ()», но не отображает введенные символы. Но вдруг у вас получилась интересная мелодия и нужно посмотреть, что вы нажимали?: можно использовать и «getche ()», а можно и в массив записывать с «getch ()». Я намеренно не усложняю текст для новичков, чтобы не скрывать простоту кода, поэтому проверку на ошибки и всё остальное вы можете дописать сами.

Исходный код музыкального инструмента:

#include 
#include "conio.h"
#include "windows.h"
#include "audiere.h"

using namespace std;
using namespace audiere;


int main()
{
    setlocale(0, "Russian");

    cout << "Играйте клавишами Q W E R T Y U I O . X - для выхода" << endl;
    AudioDevicePtr device = OpenDevice();

    OutputStreamPtr do1 = OpenSound(device , "do.wav" , false); //здесь мы начинаем создание потоков со звуками определённой высоты
    OutputStreamPtr re = OpenSound(device , "re.wav" , false);
    OutputStreamPtr mi = OpenSound(device , "mi.wav" , false);
    OutputStreamPtr fa = OpenSound(device , "fa.wav" , false);
    OutputStreamPtr sol = OpenSound(device , "sol.wav" , false);
    OutputStreamPtr la = OpenSound(device , "la.wav" , false);
    OutputStreamPtr si = OpenSound(device , "si.wav" , false);
    OutputStreamPtr do2 = OpenSound(device , "do2.wav" , false); //заканчиваем октавой - вновь нота до, но уже следующей октавы

    char notePlay = '1'; //инициализируем символьную переменную с произвольным значением

    while(notePlay!='x') //цикл выполняется, пока не нажата клавиша "x"
    {
        notePlay=getch();

        if(notePlay=='q') do1->play();
        if(notePlay=='w') re->play();
        if(notePlay=='e') mi->play();
        if(notePlay=='r') fa->play();
        if(notePlay=='t') sol->play();
        if(notePlay=='y') la->play();
        if(notePlay=='u') si->play();
        if(notePlay=='i') do2->play();

    }

    return 0;
}

Файлы *.wav для этого проекта можно скачать здесь. Распакуйте их в папку с исходным кодом.
А это для совсем новичков
В «conio.h» есть хорошая альтернатива методу «cin>>» — это «getche ()». «getche ()» не дожидается ввода команды «Enter», а присваивает значение переменной сразу после нажатия клавиши:
char inputVar;
inputVar=getche();

Но как видишь ты сможешь нажать на клавишу лишь однажды, поэтому этот метод лучше использовать для массивов в циклах:
char inputVar[30]; //наша строка-массив
int i=0; //счётчик для функции
while(!inputVar[i]=='\r' && i<100)
{
inputVar[i]=getche();
i++;
}

» ! inputVar[i]=='\r' » — это проверка на нажатие «Enter», если он будет нажат — цикл закончится. '\r' — это признак возврата каретки.

А теперь, почему в коде «getche ()» стоит так одиноко и не присваивается никакой переменной: нам это не нужно. Нужно лишь дождаться нажатия любой клавиши, после чего программа завершится.

С помощью «setlocale (0, «Russian»);» устанавливается поддержка вывода русского текста в консоль (но не ввода).

Следующие две строки будут понятнее после более продолжительного знакомства с C++, например, по книге

Герберт Шилдт — «Полный справочник по C++»

Поскольку «sound» у нас — это указатель, то методы для него будут выполняться с помощью оператора стрелочки »→», а не точки; как могло бы быть: «sound.play ()». Этому, в вышеупомянутой книге, посвящена глава «Указатели».

Желаю успеха в обучении!


Пусть этот краткий обзор послужит началом для новичков в их замыслах. Всего доброго!

Комментарии (0)

© Habrahabr.ru