Изпратете аудио изход към всички устройства с високоговорители

Трябва да мога да насоча звуковия изход от моето приложение към всички аудио изходи на системата - по-специално както към вградените високоговорители, така и към слушалките на лаптоп. Използвам C# на Windows Vista/7 и най-новата версия на .NET Framework и не е необходимо да поддържам по-стари (т.е. Windows XP) операционни системи.

Успях успешно да използвам API на Core Audio, за да променя силата на звука за активни високоговорители и успя да изброи и конкретно да манипулира отделни аудио устройства, но не успя действително да промени състоянието на устройствата, за да ги активира.

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#. Благодаря!


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