С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Как проигрывать два (и более) wave звука одновременно - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ массив и случайные числа http://www.cyberforum.ru/cpp-beginners/thread160366.html
как заполнить массив случайными числами от -20 до 20 C++
C++ Почти готовое решение.Как создать очередь? Добрый день.Подскажите,можно ли исправить готовый год?Что не так,объясните пожалуйста,если не затруднит.Задание делал в Dev-C++. Пытаюсь сохранить объекты в указателе(1 цикл while),а затем добавить... http://www.cyberforum.ru/cpp-beginners/thread160359.html
C++ Присваивание значений одного класса другому.
Скажите, могу ли я присвоить значения одного объекта класса другому объекту того же класса? class card { //код код код }; int main() { card c1, c2, c3; // заполняем класс c1
Удаление/добавление записи по ключу в односвязном списке C++
Возможно-ли удаление или добавление записи по ключу в односвязном списке? Если да, то не пойму, как "перемещаться по списку" не разрывая связь между записями... Если не трудно, покажите на...
C++ Литература по Visual C++ http://www.cyberforum.ru/cpp-beginners/thread160244.html
Доброго времени суток. 1. Подскажите пожалуйста хорошую книжку по Visual C++ класса - "от А до Я" среда VS. что бы в ней было описание всех формочек, кнопочек до сети и графики и тд. 2....
C++ Цикл for и 56 карт Выводит 14! карт в каждой строке. Я не понял как это получается. // 7_6.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> #include <cstdlib>... подробнее

Показать сообщение отдельно
M128K145
Эксперт С++
8300 / 3520 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
20.08.2010, 13:48
Работа со звуком при помощи библиотеки Audiere

В этой статье мы рассмотрим один из простейших способов работы со звуком при помощи кроссплатформенной библиотеки с открытым кодом Audiere.

Скачать свежую версию библиотеки Audiere можно с домашней страницы библиотеки http://audiere.sourceforge.net или http://aegisknight.org.

Audiere предоставляет простой и удобный объектно-ориентированный интерфейс для работы со звуком и поддерживает ряд основных форматов звуковых файлов, включая wav, mp3 и ogg.

Для работы со объектами библиотека использует smart pointer'ы, заворачивающие внутри себя указатели на объекты. При этом все объекты Audiere используют схему подсчета указателей (reference counting) позволяющую эффективно владеть объектами сразу из нескольких мест и удалять объекты, как только они становятся никому не нужными.

Ниже приводится исходный текст простейшей программы на С++, проигрывающей заданный в командной строке звук.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <audiere.h>
 
using namespace audiere;
 
inline void sleepSecond ()
{
    Sleep ( 1000 );
}
 
int main ( int argc, const char * argv [] )
{
    if ( argc != 2 && argc != 3 )
    {
        printf ( "usage: simple <filename> [<device>]\n" );
 
        return 1;
    }
 
    printf ( "initializing...\n" );
 
    const char * deviceName = "";
 
    if ( argc == 3 )
        deviceName = argv [2];
 
    AudioDevicePtr device = OpenDevice ( deviceName );
 
                                                   // check for errors
    if ( !device )
    {
        printf ( "OpenDevice() failed\n" );
 
        return 1;
    }
 
    printf ( "opened device %s\n", device -> getName () );
 
    OutputStreamPtr sound = OpenSound ( device, argv [1] );
 
    if ( !sound )
    {
        printf ( "OpenSound() failed\n" );
 
        return 1;
    }
 
    printf ( "opened sound\n" );
 
    sound -> play ();
 
    printf ( "started playback\n" );
 
    while ( sound -> isPlaying () )
    {
        sleepSecond ();
 
        if ( sound -> isSeekable () )
            printf ( "position: %d\n", sound -> getPosition () );
    }
 
    return 0;
}
Первое, что нужно сделать для использования Audiere это подключить ее заголовочный файл - audiere.h.

Поскольку библиотека помещает все свои объекты в пространство имен (namespace) audiere, то при работе с библиотекой надо или для каждого класса указывать его имя вместе с соответствующим пространством имен, т.е. писать вместо

C++
1
audiere :: AudioDevicePtr device = audiere :: OpenDevice ( deviceName );
Альтернативой этому является после подключения заголовочного файла включить все определяемые имена из пространства имен audiere к текущему пространству имен при помощи команды

C++
1
using namespace audiere;
Я лично предпочитаю второй способ, как обеспечивающий более компактную запись.

Кроме заголовочного файла audiere.h необходимо также подключить библиотеку audiere.lib.

Прежде чем можно будет проигрывает звуки и музыку необходимо создать объект, представляющий устройство, используемое для вывода звука. Для этого служит функция OpenDevice, которой в качестве первого параметра передается имя устройства, а в качестве второго параметра - строка, с дополнительными параметрами, например "buffer=100,rate=44100".

В качестве имени устройств может выступать "autodetect", предоставляющее библиотеке самой выбрать наиболее подходящее устройство.

Под Windows в качестве имени устройства можно использовать "directsound" или "winmm", обеспечивающее вывод звука через DirectSound или через стандартную мультимедийную библиотеку winmm.lib.

Под Linux в качестве имени устройства может выступать "oss", обозначающее работу через Open Sound System.

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

Поэтому запись

C++
1
AudioDevicePtr device = OpenDevice ();
вполне допустима и возвращает (smart) указатель на устройство, которое может в дальнейшем использоваться для воспроизведения звука.

Выражение !device вернет значение true, если устройство не удалось создать (это принятая в Audiere практика для любого smart-указателя на объект).

Следующим шагом после создания устройства является создание объектов, соответствующим звуковым файлам.

Для этого служит функция OpenSound, получающая в качестве первого параметра указатель на устройство, используемое для вывода звука. В качестве второго параметра может выступает имя файла или же указатель на объект, обеспечивающий загрузку звуковых данных.

Третий параметр - булевское значение - определяет, нужно ли сразу загружать весь файл в память (false) или же следует осуществлять динамическую подкачку данных. Значение по умолчанию обеспечивает полную загрузку всего файла в оперативную память.

Функция OpenSound возвращает указатель на объект, используемый для воспроизведения соответствующего звука.

Доступными пользователю методами являются:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void    play      ();
void    stop      ();
bool    isPlaying ();
void    reset     ();
void    setRepeat ( bool repeat );
bool    getRepeat ();
void    setVolume ( float volume );
float   getVolume ();
void    setPan    ( float pan );
float   getPan    ();
void    setPitchShift ( float shift );
float   getPitchShift ();
bool    isSeekable    ();
int     getLength     ();
void    setPosition   ( int pos );
int     getPosition   ();
Метод play включает воспроизведение данного звука. При этом воспроизведение происходит асинхронно, т.е. управление сразу же возвращается программе, а звук(музыка) начинает играть параллельно выполнению программы.

Обратите внимание, что в связи с этим в ключах компилятору и линкеру следует указать, что собирается многонитевое (multithreaded) приложение.

Метод stop останавливает воспроизведение звука.

Метод isPlaying возвращает значение true, если данный звук(музыка) в настоящий момент воспроизводится.

Метод reset сбрасывает звук и возвращает его к началу.

Метод setRepeat позволяет задать режим повторения звука, т.е. по окончании воспроизведения, звук снова проигрывается с самого начала и так далее.

Метод getRepeat возвращает текущее значение флага повторения звука.

Метод setVolume служит для задания громкости звучания, при этом значению 0.0 соответствует полная тишина (для данного звука), а значению 1.0 - максимальная громкость.

Метод getVolume позволяет узнать текущую громкость для данного звука.

Метод setPan служит для задания баланса. Значению -1.0 соответствует только левый канал, значению 1.0 соответствует только правый работающий канал. Значению 0.0 соответствует нормальный баланс (одинаковые значения для правого и левого каналов). По умолчанию установлено значение 0.0.

При помощи метода getPan можно узнать текущее значение баланса.

Метод setPitchShift позволяет задать сдвиг тональности и принимает значения от 0.5 до 2.0. По умолчанию установлено значение 1.0.

При помощи метода getPitchShift можно узнать текущее значение сдвига тона.

При помощи метода isSeekable можно узнать поддерживается ли для данного звука позиционирование. Само позиционирование осуществляется при помощи метода setPosition. Текущую позицию можно узнать при помощи метода getPosition.

Метод getLength возвращает длину звука.

При этом может одновременно и совершенно независимо друг от друга воспроизводится несколько различных звуков (например, фоновая музыка, выстрелы, крики противников).

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

Если необходимо явно уничтожить какой-либо объект библиотеки Audiere то достаточно будет просто присвоить соответствующему указателю значение NULL. Это приведет к уничтожению соответствующего объекта.

По этой ссылке можно скачать весь исходный код к этой статье. Также доступны для скачивания откомпилированные версии для MS Windows, Linux.


Источник
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.