Послать аудиовыход на все акустические устройства - PullRequest
1 голос
/ 21 августа 2010

Мне нужно иметь возможность направлять звук из моего приложения на все аудиовыходов системы - в частности, как встроенные динамики, так и наушники ноутбука.Я использую 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 Interface , но мне трудно, поскольку он не предлагается в качестве управляемого кода, а используемая оболочка .NET не полностью его реализует.Я также открыт для предложений, которые используют совершенно другой подход, если я все еще могу сделать это с помощью C #.Спасибо!

1 Ответ

0 голосов
/ 14 июня 2011

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

...