Как я могу воспроизводить звук только из одного динамика в C ++? - PullRequest
2 голосов
/ 02 января 2011

У меня есть звуковая карта, которая поддерживает несколько динамиков (Creative SB X-Fi). Я пытаюсь написать программу на C ++ (Windows 7 Environment, Visual Studio IDE), которая будет воспроизводить данный монофонический файл wav на одном из 4 подключенных мной динамиков. Кто-нибудь может указать мне правильное направление относительно конкретных функций, которые будут выполнять эту цель? Моя попытка отыскать решение не принесла плодов. Спасибо.

Ответы [ 3 ]

3 голосов
/ 02 января 2011

Вы можете воспроизводить звук через колонки объемного звучания, используя DirectSound. См. Страницу MSDN "Звуки в 3D" .

2 голосов
/ 02 января 2011

Я предлагаю сначала попробовать ответ Бена Фойгта, так как, если это сработает, это, вероятно, будет проще и более гибким.

Но если по какой-то причине это не так, другая альтернатива выглядит следующим образом.

Как правило, когда вы хотите воспроизвести моно .wav из определенного динамика, преобразуйте его в 6-канальный .wav, который без звука на пяти каналах, но содержит данные из моно .wav на канале для динамик, на котором вы хотите играть.

Это должно быть довольно легко сделать, потому что формат файла .wav очень прост. Основная идея заключается в том, что звуковые данные в вашем моно .wav-файле будут состоять из (обычно) двухбайтовых пар для каждого аудиосэмпла, например:

1234 2ab3 def0 ce18 ....

Чтобы преобразовать эти данные в многоканальные, вам нужно вставить тишину (ноль) для других каналов. Например, для канала 0 (передний левый) вы бы использовали:

1234 0000 0000 0000 0000 0000 2ab3 0000 0000 0000 0000 0000 def0 0000 0000 0000 0000 0000 (etc)

тогда как для переднего правого вы бы использовали:

0000 1234 0000 0000 0000 0000 0000 2ab3 0000 0000 0000 0000 0000 def0 0000 0000 0000 0000 (etc)

(см. Этот список назначений докладчиков для заказа.)

Вам также необходимо иметь дело с заголовком файла, но формат заголовка волнового файла очень прост; вам нужно изменить NumChannels с 1 на 6, ByteRate с любого значения на то же значение, умноженное на 6, аналогично для BlockAlign и Subchunk2Size.

NB. На самом деле я не проверял ничего из вышеперечисленного, но экспериментирование не должно занять слишком много времени. Если это не сработает, может потребоваться добавить более новые данные WAVE_FORMAT_EXTENSIBLE в файл - более аккуратно, но все же не слишком сложно; Вот полезная страница, описывающая эти расширения в формате .wav .

0 голосов
/ 02 января 2011

Вы пробовали библиотеку BASS?

http://www.un4seen.com/

Несколько выходов Одновременно используйте несколько звуковых карт и перемещайте каналы между ними

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