Обычно при воспроизведении звуковых файлов используется одновременно только один файл. Этого вполне достаточно для работы плеера или организации звукового сопровождения работы какой-либо программы. Однако существуют задачи для решения, которых необходимо одновременно воспроизводить, как минимум, два файла. Как правило, в данном случае речь идёт о задачах так или иначе связанных с микшированием.
С помощью библиотеки BASS эти задачи решаются довольно легко.
Микширование в библиотеке BASS осуществляется автоматически. Поэтому необходимо просто создать два или более звуковых канала и запустить их на воспроизведение. Реализуется это следующим образом (на примере двух каналов).
Объявление переменных:
1 2 |
chan1: HSTREAM; // Первый канал воспроизведения chan2: HSTREAM; // Второй канал воспроизведения |
1 2 3 4 |
chan1 := BASS_StreamCreateFile(FALSE, PWideChar('test1.mp3'), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); chan2 := BASS_StreamCreateFile(FALSE, PWideChar('test2.mp3'), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); BASS_ChannelPlay(chan1, True); BASS_ChannelPlay(chan2, True); |
1 2 |
BASS_StreamFree(chan1); BASS_StreamFree(chan2); |
Такой подход прост в реализации и вполне приемлем при малом количестве файлов и, соответственно, каналов. В случае же большого количества, он не эффективен (как минимум, с точки зрения программирования). В подобных ситуациях, необходимо использовать массив.
Для наглядности рассмотрим пример реализации для четырёх каналов.
Объявление массива:
1 |
chans: array [1 .. 4] of HSTREAM; |
1 2 3 4 5 6 |
for i := 1 to 4 do begin chans[i] := BASS_StreamCreateFile(FALSE, PWideChar('test' + IntToStr(i) + '.mp3'), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); BASS_ChannelPlay(chans[i], True); end; |
1 2 3 4 |
for i := 1 to 4 do begin BASS_StreamFree(chans[i]); end; |
Полное описание работы с библиотекой BASS можно найти на официальном сайте её разработчика.
Вот это и искал. СПС. Возможно лучше будет использовать часть DelphiX — Dsound? для игры типа арканоид. Бывает звук удара о кубик не успевает заканчиваться, а шар ударяет уже другой кубик.
Всегда пожалуйста! По Вашему вопросу с ходу подсказать что-либо сложно. Возможно Вам будет проще самостоятельно попробовать различные решения и выбрать подходящее. Хотя по сути, что BASS, что DelphiX это «обёртки» над DirectX.
А как быть с последовательным? К примеру, озвучить какую либо номенклатуру, состоящую из нескольких параметров, например: длина*ширина*высота т.е. должна сформироваться единая последовательность из нескольких звуковых файлов, которую нужно воспроизвести последовательно
Вы по сути сами же отвечаете на собственный вопрос. К слову, у BASS есть возможность определить воспроизводится ли файл в данный момент или нет (см. документацию). Опираясь на это можно определить завершение воспроизведения для запуска следующего файла. Если интересуют «технические детали», то последовательное воспроизведение уже неоднократно рассматривалось на просторах сети.