Отправить аудиовыход на все устройства динамиков

Мне нужно иметь возможность направлять звук из моего приложения на все аудиовыходы системы, в частности, на встроенные динамики и наушники ноутбука. Я использую C# в Windows Vista/7 и последней версии .NET Framework, и мне не нужно поддерживать более старые (например, Windows XP) ОС.

Мне удалось успешно использовать Core Audio API для изменения громкости активных динамиков и мог перечислять отдельные аудиоустройства и конкретно управлять ими, но не мог фактически изменить состояние устройств, чтобы включить их.

private MMDeviceEnumerator devEnum = new MMDeviceEnumerator();
private MMDeviceCollection audioDevices = null;

public Form1()
{
    InitializeComponent();
    this.defaultDevice = this.devEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);
    AudioEndpointVolumeNotificationDelegate(AudioEndpointVolume_OnVolumeNotification);
    this.audioDevices = this.devEnum.EnumerateAudioEndPoints(EDataFlow.eRender, EDeviceState.DEVICE_STATEMASK_ALL);
    for (int i = 1; i < this.audioDevices.Count; i++)
    {
        // Doesn't work - throws exception because property is read-only:
        // this.audioDevices[i].State = EDeviceState.DEVICE_STATE_ACTIVE 
    }
}

По сути, я ищу способ включить аудиоустройства, а не просто регулировать их громкость. Кто-нибудь знает способ сделать это? Я просматривал документацию MSDN для интерфейса IMMDevice, но найти это сложно, поскольку он не предлагается в виде управляемого кода, а используемая мной оболочка .NET не полностью его реализует. Я также открыт для предложений, использующих совершенно другой подход, если я все еще могу сделать это с помощью C#. Спасибо!


person nhinkle    schedule 21.08.2010    source источник
comment
Даже если вы можете включить различные устройства, такие как bluetooth-гарнитура и встроенные динамики, вы вряд ли сможете воспроизводить звук через динамики при подключенных наушниках — обычно это чисто электрическое — механическая вставка разъемов для наушников. звук на подключенное устройство вместо динамиков. Что касается компьютера, то это все одно устройство.   -  person Jay    schedule 21.08.2010
comment
Не зная, какой API вы используете для рендеринга звука, трудно ответить на вопрос.   -  person ReinstateMonica Larry Osterman    schedule 22.08.2010


Ответы (1)


Если вы убедитесь, что устройства, с которых вы хотите получить звук, включены в панели управления звуком Windows, все они будут отображаться как DEVICE_STATE_ACTIVE. Если вы хотите отправить один и тот же аудиофайл для одновременного воспроизведения на нескольких устройствах, вы сможете сделать это с помощью Core Audio API. Но если вы хотите управлять другими приложениями, чтобы заставить их воспроизводиться на всех этих выходах, вам придется переписать их код; P. Вы можете создать низкоуровневый драйвер, который будет перехватывать весь исходящий звук, а затем перенаправлять его на все устройства, которые вы используете. хотеть. Что-то вроде http://ac3filter.net/ (хотя я думаю, что ac3Filter работает, только если приложение использует DirectShow)

person Wil    schedule 14.06.2011
comment
ac3filter не перехватывает весь исходящий звук, он просто выводит многоканальный аудиопоток. Если у вас многоканальная звуковая карта, вы будете слышать что-то во всех динамиках. - person yms; 14.06.2011