Russian Qt Forum
Ноябрь 22, 2024, 13:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Программно изменить «Расположение динамиков»  (Прочитано 10169 раз)
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« : Декабрь 16, 2012, 21:17 »

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

Скриншот диалога, чтобы было понятнее о какой настройке речь:
Записан
tester64
Гость
« Ответ #1 : Декабрь 17, 2012, 09:39 »

К схожей проблеме, выбору звукового устройства, есть несколько подходов, может что-нибудь из этого поможет:

― С помощью mmsys.cpl: Changing your Windows audio device programmatically using VC++. Есть команды вызыва диалогов (к примеру, "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.

― Через реестр: 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 (в комментариях также есть ссылка на готовую GUI программу PlaybackDevice). Нужно копаться в исходниках Window, была утечка, где-нибудь на трекерах наверняка сохранилось.
Записан
Bepec
Гость
« Ответ #2 : Декабрь 17, 2012, 09:55 »

WinApi из msdn. В Windows 7 помоему это упрощено, в XP незнаю.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Декабрь 17, 2012, 10:33 »

Через реестр: 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 незнаю.
ну подскажите хоть чего там искать, а то я как-то не знаю.
Записан
Bepec
Гость
« Ответ #4 : Декабрь 17, 2012, 10:48 »

Посмотрю после обеда.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Декабрь 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 узел.  ).
« Последнее редактирование: Декабрь 17, 2012, 11:36 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Декабрь 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
« Последнее редактирование: Декабрь 17, 2012, 11:33 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Dancing_on_water
Гость
« Ответ #7 : Декабрь 17, 2012, 13:27 »

Вы хотите не изменить расположение динамиков, а залезть в драйвера и микшер.

Судя по этой статье, начиная с виндовс 7, сделать это если можно, пустив под нож все остальные приложения.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #8 : Декабрь 17, 2012, 13:43 »

Вы хотите не изменить расположение динамиков, а залезть в драйвера и микшер.
Это не моё название, а Microsoft так это в своём гуе называет. В семёрке этот параметр называется «звуковые каналы».

И да, интересует только XP.
Записан
tester64
Гость
« Ответ #9 : Декабрь 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 дескрипторы пары окон (вначале диалога  "Свойства: Звуки и аудиоустройства" по дескриптору процесса, потом диалога "Дополнительные свойства звука").
Решение понятно корявое, но на безрыбье и рак рыба...

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

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Декабрь 17, 2012, 14:59 »

Может это?

http://msdn.microsoft.com/ru-ru/library/windows/desktop/microsoft.directx_sdk.idirectsound8.idirectsound8.setspeakerconfig%28v=vs.85%29.aspx
Записан

ArchLinux x86_64 / Win10 64 bit
tester64
Гость
« Ответ #11 : Декабрь 17, 2012, 15:45 »


Возможно. Судя по этой странице функциональность недоступна только на 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.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 23.