2014-01-04 5 views
1

ОК, первый выпуск. Я пытаюсь написать виртуальную деку, которая будет выводиться сразу на несколько устройств. Я бы предпочел OpenAL для этого, но если мне нужно переключиться на MS libs (я пишу это сначала на Windows 7), я это сделаю.Одновременно вывод звука на несколько аудиоустройств

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

Я получил OAL до такой степени, что могу играть на устройстве по умолчанию, и выбор устройства на данный момент кажется довольно тривиальным. Однако из того, что я понимаю, каждому устройству OAL необходимо, чтобы его контекст был текущим, чтобы буфер заполнялся/распространялся должным образом. Это означает, что в стандартной программе звук будет воспроизводиться на одном устройстве, а затем устройство будет переключаться, а звук буферизируется, а затем воспроизводится на втором устройстве.

Возможно ли это вообще, с любой аудио-библиотекой? Будут ли задействованы потоки, и будут ли они безопасными?

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

+0

Кроме того, я даже не знаю, где это отправило, не говоря уже, если она размещена правильно. Если он не в нужном месте, я был бы признателен за его перемещение. Благодарю. – Malkierian

ответ

1

Если я хорошо понял, здесь есть два вопроса.

  1. Можно ли воспроизводить звук на двух или более устройствах вывода звука одновременно и как это достичь?

  2. Возможно ли зацикливание данных через устройство ввода аудиосигнала (записи) так, что оно воспроизводится на соответствующем мониторе, например, отправленном через аудиопоток Skype вашему партнеру в вашем соответствующем случае.

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

Как?

Большинство аудио-фреймворков/систем предоставляют функции, позволяющие получить «дескриптор устройства», в котором вам понадобится передать обратный вызов для подачи буфера с образцами (например, Open AL). Это будет вызываться независимо и асинхронно с помощью фреймворка/системы (в конечном счете, драйверов звуковых устройств). Так как это все работает асинхронно, вам не обязательно нужно многопоточность. Все, что вам нужно сделать в принципе, это поддерживать два (или более) аудиоустройства устройства вывода звука, каждый из которых использует отдельный обратный вызов для подачи двух (или более) отдельных устройств.

Примечание Вы также можете воспроизводить несколько звуков на одном устройстве. Большинство устройств/систем допускают такой «обмен ресурсами».На самом деле, это одна из целей, для которой фактически созданы звуковые карты. Смешать все звуки, создаваемые различными программами (и, следовательно, снять эту тяжелую нагрузку с CPU). Когда вы используете одно (физическое) устройство для воспроизведения нескольких звуков, концепция такая же, как и для нескольких устройств. Для каждого звука вы получаете логический дескриптор устройства. Только то, что эти дескрипторы относятся к нескольким «каналам» одного физического устройства.

Что вы должны использовать?

Open AL кажется, немного похож на использовании тяжелой артиллерии для этой простой задачи, я бы сказал (так как вы не хотите что много портативности, и, вероятно, не планирует реализовать свой собственный кодек и эффекты;))

Я бы порекомендовал вам использовать Qt здесь. Он очень портативный (Win/Mac/Linux), и у него есть очень удобный класс, который сделает вашу работу: http://qt-project.org/doc/qt-5.0/qtmultimedia/qaudiooutput.html

Посмотрите пример в документации, чтобы посмотреть, как играть в WAV-файл, с несколькими строки кода. Чтобы воспроизводить несколько файлов WAV одновременно, вам просто нужно открыть несколько QAudioOutput (в основном, вывести код из примера в функцию и называть его так часто, как вы хотите). Обратите внимание, что вам нужно закрыть/остановить QAudioOutput, чтобы звук переставал воспроизводиться.

Ответ на 2: То, что вы хотите сделать, называется loopback. Только очень ограниченное количество звуковых карт, например, аудиоустройства, обеспечивают так называемое устройство ввода петли, что позволяет записывать то, что в настоящее время выводится с помощью основного выходного сочетания звуковой карты, например. Тем не менее, даже такое устройство предоставлено, оно не позволит вам ничего проталкивать в устройство ввода микрофона. Устройство ввода микрофона принимает данные только от микрофонного D/A преобразователя. Это глубоко в H/W, вы не можете ничего смешать на своем уровне.

Это будет очень тяжело (IMHO практически невозможно), чтобы Skype отправил ваш звук стандартной настройке вашему партнеру по разговору. Единственное, что я могу придумать, - это иметь аудиоустройство с возможностями loopback (или просто физическое кабельное соединение с возможной линейкой мониторов на любую строку записи), и затем Skype настроен на использование этого устройства с обратной связью в качестве входного , Тем не менее, Skype не будет забрать с микрофона больше, а значит, вы не будете иметь разговор;)

Примечание: Когда мы говорим «одновременного» воспроизведения здесь, речь идет о синхронизации воспроизведения двух звуков, как обеспокоены восприятие в реальном времени (в диапазоне 10-20 мс). Мы не смотрим на фактическую синхронизацию на уровне выборки, а также связанные с ними проблемы с джиттером и фазовым сдвигом, возникающие при передаче звука на два физических устройства с двумя независимыми (свободными работающими) часами. Таким образом, когда приложение требует генерации фазового сигнала на независимых устройствах, необходимы механизмы восстановления часов, которые могут предоставляться драйверами или ОС.

Примечание: Программное обеспечение виртуального аудио устройства, такое как Virtual Audio Cable, обеспечит виртуальные устройства для обеспечения функциональности loopback в Windows. Такие среды, как Jack Audio, могут быть одинаковыми в среде UX.

+0

Огромное предостережение от этого, и это синхронизация. Если OP не заботится о синхронности выходов, описанный выше подход будет работать очень хорошо. Если, с другой стороны, это требование, эта проблема становится намного сложнее, так как необходимо учитывать задержки буфера для каждого вывода. – marko

+0

Я не согласен. Прежде всего, какую задержку вы имеете в виду? IMHO все, что вам нужно сделать, это * count * buffers и добавить i.e их соответствующим образом. Либо путем передачи их в отдельные аппаратные буферы, либо путем добавления их в программное обеспечение (суммирование значений и присвоенного взвешивания во избежание искажений). – Tchakabam

+0

Очевидно, что * точный * способ синхронизации является вторым (суммирование в программном обеспечении). Я согласен, что вы не можете убедиться, что ваши аппаратные буферы «находятся в фазе». Однако это различие находится в диапазоне таких низких фазовых углов, что вы только осознаете это в профессиональных аудиоприложениях, таких как генераторы сигналов. – Tchakabam

1

Существует очень простой способ вывода звука на два устройства одновременно:

  1. Для устройств Realtek вы можете использовать аудио-микшер «трюк» (но это даст вам задержку/эхо);
  2. Для всего остального (и без эха) вы можете использовать Voicemeeter (который полностью свободен).

Я объяснил ОБА решения в этом видео: https://youtu.be/lpvae_2WOSQ

С наилучшими пожеланиями

+3

Было бы лучше объяснить все это в тексте, нет необходимости в внешних ссылках Youtube. – Nicolay77