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

в 12:29, , рубрики: audiere, Audio API, beginner manual, c++, Программирование, метки:

Приветствую! Данная заметка ориентирована на начинающих программистов, самых, что ни на есть новичков. Она о простой библиотеке 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 <iostream> //нужен для вывода строк "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<<"Простейшее воспроизведение звука"<<endl; 

AudioDevicePtr device  = OpenDevice(); //Для начала нужно открыть AudioDevice 
OutputStreamPtr sound = OpenSound(device , "sound.wav" , false); //создаем поток для нашего звука
sound->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 <iostream> //нужен для вывода строк "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<<"Простейшее воспроизведение звука"<<endl; 

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

OutputStreamPtr sound = OpenSound(device , "sound.wav" , false); //открываем наш звук
if(!sound){
cout<<"Ошибка открытия файла! Для выхода нажмите любую клавишу..";
getche();
return 0;
}

sound->play(); //проигрываем наш звук
getche(); //ждём нажатия любой клавиши прежде чем выйти из программы

}

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

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

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

#include <iostream>
#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()». Этому, в вышеупомянутой книге, посвящена глава «Указатели».

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

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

Автор: Silentfog

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js