Russian Qt Forum

Компиляторы и платформы => Windows => Тема начата: LisandreL от Декабрь 16, 2012, 21:17



Название: Программно изменить «Расположение динамиков»
Отправлено: LisandreL от Декабрь 16, 2012, 21:17
Подскажите как программно изменить «Расположение динамиков», т.е. переключиться между наушниками, 2.0, 5.1, 7.1 и т.п. Ну или хотя бы в какую сторону копать.
Завязки на Qt нет, так что любыми средствами: WinAPI, ActiveX or what ever.
Интересует в общем-то только Windows XP SP3.
В реестре значение нашёл, но надо чтоб переключалось «на горячую», а не при перезагрузке / открытие и закрытие OKеем этого диалога.

Скриншот диалога, чтобы было понятнее о какой настройке речь:


Название: Re: Программно изменить «Расположение динамиков»
Отправлено: tester64 от Декабрь 17, 2012, 09:39
К схожей проблеме, выбору звукового устройства, есть несколько подходов, может что-нибудь из этого поможет:

― С помощью mmsys.cpl: Changing your Windows audio device programmatically using VC++ (http://www.codeproject.com/Articles/31836/Changing-your-Windows-audio-device-programmaticall). Есть команды вызыва диалогов (к примеру, "rundll32 mmsys.cpl, showaudiopropertysheet", или в другом синтаксисе: "rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0" для "Multimedia/Audio", "rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1" для "Sound Properties"), можно поискать в бинарнике по "*propertysheet" и т.п. Возможно удастся отыскать прямую команду (без диалога). Если нет, можно попытаться открывать диалог в скрытом режиме (к примеру, за границами рабочего стола) и слать ему клавиатурные сообщения. Как вариант - с помощью AutoHotkey скрипта: Switch Between Sound Outputs with a Keyboard Shortcut (http://lifehacker.com/5921884/chrome-tabs-usb-headphones-and-getting-locked-out/gallery/3).

― Через реестр: How to change default sound playback device programatically (http://stackoverflow.com/questions/2175318/how-to-change-default-sound-playback-device-programatically) (ответ stacker). Какие ключи реестра меняются, можно отловить посредством Process Monitor (бывшие RegMon+FileMon). Пожалуй это самый простой и наименее времязатратный вариант.

― Недокументированный API (COM-интерфейс IPolicyConfig): Programmatically (or Command Line) change the default sound playback device in Windows 7 (http://www.daveamenta.com/2011-05/programmatically-or-command-line-change-the-default-sound-playback-device-in-windows-7/) (в комментариях также есть ссылка на готовую GUI программу PlaybackDevice (http://heilnizar.deviantart.com/art/PlaybackDevice-Audio-Output-Switch-285591834)). Нужно копаться в исходниках Window, была утечка, где-нибудь на трекерах наверняка сохранилось.


Название: Re: Программно изменить «Расположение динамиков»
Отправлено: Bepec от Декабрь 17, 2012, 09:55
WinApi из msdn. В Windows 7 помоему это упрощено, в XP незнаю.


Название: Re: Программно изменить «Расположение динамиков»
Отправлено: LisandreL от Декабрь 17, 2012, 10:33
Через реестр: How to change default sound playback device programatically (http://stackoverflow.com/questions/2175318/how-to-change-default-sound-playback-device-programatically) (ответ stacker). Какие ключи реестра меняются, можно отловить посредством Process Monitor (бывшие RegMon+FileMon). Пожалуй это самый простой и наименее времязатратный вариант.
Ключи то я нашёл, но, что логично, система эти настройки не перечитывает постоянно, а до перезагрузки ждать - не вариант.

Как вариант - с помощью AutoHotkey скрипта: Switch Between Sound Outputs with a Keyboard Shortcut.
Programmatically (or Command Line) change the default sound playback device in Windows 7 (в комментариях также есть ссылка на готовую GUI программу PlaybackDevice).
Задача немного другая - надо не девайсы менять, а количество каналов в одном девайсе.

WinApi из msdn. В Windows 7 помоему это упрощено, в XP незнаю.
ну подскажите хоть чего там искать, а то я как-то не знаю.


Название: Re: Программно изменить «Расположение динамиков»
Отправлено: Bepec от Декабрь 17, 2012, 10:48
Посмотрю после обеда.


Название: Re: Программно изменить «Расположение динамиков»
Отправлено: kuzulis от Декабрь 17, 2012, 11:07
Если именно ХР - то ХЗ, если Виста и выше - то WASAPI.

Но это с условием, что девайс позволяет менять кол-во каналов при помощи "СТАНДАРТНОГО"
Kernel Streaming (KS) интерфейса.

Хотя, в принципе для твоего девайса, должен быть стандартный интерфейс управления WDM аудио девайсами (фильтрами),
посмотри в сторону KS.

PS:
Но может быть и иначе: например, в продукте нашей компании смена режима Stereo, 4.1, 5.1, 7.1 и т.п.
осуществляется через нашу контрол-панель, путем прямого вызова DeviceIoControl к нашему драйверу.
И в этом случае драйвер удаляет предыдущую WDM топологию и создает новую
(т.е., к примеру в Win7 Sound CPL отображались 4 пары Stereo L/R выходов, а после вызова контроля будет
отображаться один 7.1 узел.  ).


Название: Re: Программно изменить «Расположение динамиков»
Отправлено: kuzulis от Декабрь 17, 2012, 11:31
Вот, почитай это: http://msdn.microsoft.com/en-us/library/windows/hardware/ff536332%28v=vs.85%29.aspx

Проидись по всем ссылочкам... Может поможет что-то.

Еще см. тут:
http://msdn.microsoft.com/ru-ru/library/windows/desktop/dd316575%28v=vs.85%29.aspx
http://msdn.microsoft.com/ru-ru/library/windows/desktop/dd316569%28v=vs.85%29.aspx


Название: Re: Программно изменить «Расположение динамиков»
Отправлено: Dancing_on_water от Декабрь 17, 2012, 13:27
Вы хотите не изменить расположение динамиков, а залезть в драйвера и микшер.

Судя по этой (http://habrahabr.ru/post/115092/) статье, начиная с виндовс 7, сделать это если можно, пустив под нож все остальные приложения.


Название: Re: Программно изменить «Расположение динамиков»
Отправлено: LisandreL от Декабрь 17, 2012, 13:43
Вы хотите не изменить расположение динамиков, а залезть в драйвера и микшер.
Это не моё название, а Microsoft так это в своём гуе называет. В семёрке этот параметр называется «звуковые каналы» (http://s4.hostingkartinok.com/uploads/images/2012/12/61bf78362e77a850fcfcccc24d08156c.png).

И да, интересует только XP.


Название: Re: Программно изменить «Расположение динамиков»
Отправлено: tester64 от Декабрь 17, 2012, 14:56
Как вариант - с помощью AutoHotkey скрипта: Switch Between Sound Outputs with a Keyboard Shortcut.
Programmatically (or Command Line) change the default sound playback device in Windows 7 (в комментариях также есть ссылка на готовую GUI программу PlaybackDevice).
Задача немного другая - надо не девайсы менять, а количество каналов в одном девайсе.

Ну да, я и написал: "К схожей проблеме, выбору звукового устройства...".
Но скрипт просто адаптировать к выбору канальности. Вот к примеру выбор пункта "Квадрофонические динамики" (проверил под в Windows XP SP3 rus):
Код:
Run, RunDll32.exe shell32.dll`,Control_RunDLL mmsys.cpl`,`,0
WinWait,ahk_class #32770
Send, {tab 5}{enter}
Send, {home}{down 9}{tab}{enter}
Send, {tab}{enter}
Тоже можно разумеется сделать и напрямую из C++ программы, только посложнее, поскольку нужно получить HWND дескрипторы пары окон (вначале диалога  "Свойства: Звуки и аудиоустройства" по дескриптору процесса, потом диалога "Дополнительные свойства звука").
Решение понятно корявое, но на безрыбье и рак рыба...

Насколько я знаю, официального майкрософтовского способа установить программно канальность не существует. Во избежание проблем (для службы поддержки) из-за перезаписи настроек производителями софта.
Буду рад ошибиться.


Название: Re: Программно изменить «Расположение динамиков»
Отправлено: kuzulis от Декабрь 17, 2012, 14:59
Может это?

http://msdn.microsoft.com/ru-ru/library/windows/desktop/microsoft.directx_sdk.idirectsound8.idirectsound8.setspeakerconfig%28v=vs.85%29.aspx


Название: Re: Программно изменить «Расположение динамиков»
Отправлено: tester64 от Декабрь 17, 2012, 15:45
Может это?

http://msdn.microsoft.com/ru-ru/library/windows/desktop/microsoft.directx_sdk.idirectsound8.idirectsound8.setspeakerconfig%28v=vs.85%29.aspx

Возможно. Судя по этой странице функциональность недоступна только на Vista/7/8:
Цитировать
In Windows Vista and later versions of Windows, SetSpeakerConfig is a NOP. For Windows Vista and later versions, the speaker configuration is a system setting that should not be modified by an application. End users can set the speaker configuration through control panels.