Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
MkG
0 / 0 / 0
Регистрация: 18.04.2010
Сообщений: 25
19.08.2010, 19:15     Как проигрывать два (и более) wave звука одновременно #1
Мне нужно проигрывать несколько звуковых файлов одновременно. Например, в одно и то же время включить два звука. Или включить звук, не выключая играющий в данный момент.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2010, 19:15     Как проигрывать два (и более) wave звука одновременно
Посмотрите здесь:

Найти в строке два одинаковых фрагмента (не включая пробелы) длиной более 5 символов C++
как можно более просто написать эту программку(более понятным языком для начинающего) C++
C++ Как удержать более пяти клавиш одновременно?
C++ Написать программу, которая находит в массиве значения, повторяющиеся два и более раз
Написать программу, которая находит в массиве значения, повторяющиеся два и более раз, и показывает их на экран C++
C++ Копирование в два и более файла
C++ Два таймера одновременно
Два и больше действия одновременно, как реализовать? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
20.08.2010, 13:48     Как проигрывать два (и более) wave звука одновременно #2
Работа со звуком при помощи библиотеки 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.


Источник
MkG
0 / 0 / 0
Регистрация: 18.04.2010
Сообщений: 25
20.08.2010, 17:06  [ТС]     Как проигрывать два (и более) wave звука одновременно #3
Создал простеньку программу:
C++
1
2
3
4
5
6
7
8
9
10
#include "audiere.h"
 
using namespace audiere;
 
int main ()
{    
    AudioDevicePtr device = OpenDevice ();
    OutputStreamPtr s0 = OpenSound (device, "0.wav");
    s0 -> play ();
}
Использую Dev-C++ 4.9.9.2
В настройках проекта указал компоновщик audiere.lib
Как проигрывать два (и более) wave звука одновременно
Audiere.lib лежит в той же папке, что и сам проект.
В результате получаю ошибку [Build Error] [myproject.o] Error 1 и проект не компилируется.
Как это исправить?
Yandex
Объявления
20.08.2010, 17:06     Как проигрывать два (и более) wave звука одновременно
Ответ Создать тему
Опции темы

Текущее время: 00:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru