purebasic.info

PureBasic forum
Текущее время: Пт сен 21, 2018 3:29 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
СообщениеДобавлено: Сб фев 07, 2015 5:06 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Немнго истории:
С тех пор как в доме появился высокоскоростной интернет - я отказался от всех этих кабельных ТВ и начал использовать http://torrent-tv.ru по HDMI. И все бы ничего, но задолбало переключать звук (через одно место) с ТВ на колонки компа и обратно. Нужно нажать в трее треугольничег, потом ПКМ нажать иконку динамиков, выбрать в меню 'Устройства воспроизведения', найти нужное устройство и сделать его дефолтным. Почему-то в win xp такого гемора не было, звук выводился на все подключенные устройства, а на 7-ке уже фигвам. Короче, это сильно раздражало и пришла мысля как-то это дело упростить, че мы не программисты штоле :). После долгого изученья Гугла, с удивлением заметил, что "пряморуких" программных способов не существует :( В одном случае описывается как программно вызывать аплет "Звук" и программно тыкать в нем кнопки, но это же не наш метод. В другом случае предлагалось изменять время в
ключах реестра. С реестром я проверил, да способ рабочий, НО программы не видят этого переключения в реальном времени до своего рестарта.
Много писалось что документированных способов для win 7 & > не существует. Пока я шарился в интернетах, обнаружил несколько утилит для переключения звуковых устройств. Тут можно было бы и тормознуть, но какгрится "нога попала в колесо". Значит способ существует! Потом нашел статью Еретика с этого собственно и пошло написание этой утилиты. Признаюсь сразу что ничего я не придумал, все сделал Еретик в плане способа переключения устройств.
А вот перечислять (енумить) устройства у MS есть аж три способа. Первый счас уж не помню (вспомнил, при помощи API waveOutGetNumDevs() и waveOutGetDevCaps()), он обрезает названия устройств зв. вывода. Второй метод енумить через DirectSound (Кому интересно, могу выложить коды) Его-то я для перечисления сначала и использовал, но не нравилось мне что устройства воспроизведения всегда переставляются местами - первое это дефолтное, второе - которое до этого было дефолтным и т.д.
Ну и третья метода это через COM интерфейсы. Это было самое трудное, но зато и самое интересное... Нигде я не нашел (в интернетах) толковой реализации пришлось брать в руки OllyDbg и исследовать сторонние проги

Как использовать: при первом запуске появится окошко, сделайте настройки во вкладке "Settings", задайте горячие клавиши и ву аля
PS прога при старте создает в реестре ключ "HKEY_CURRENT_USER\Software\DefaultAudioDevice". Если прога не нужна, удалите этот ключ
PSS Для вкладки Recording код написан просто для примера, не оптимизирован и т.д.
Короче, прошу прощения за многабукав, утиль оттестирован на win 7x64, win 8x64, всем добра
Если у кого есть замечания или предложения, пож. пишите


Вложения:
dAd.rar [87.47 KiB]
Скачиваний: 142

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс мар 01, 2015 7:36 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
У меня в коде есть такой участок
Код:
1
 keyDeviceDesc\pid = $0E                                               ; х.з почему $0E, подсмотрел в отладчике  


Если заменить $0E на 2, тогда метод
Код:
1
ppProperties\GetValue(keyDeviceDescShort, @pv)


вернет короткое название звукового устройства. Почему так, я не знаю. Документации так и не нашел
(если ставить какие-либо другие числа, метод валится с ошибкой)

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс мар 01, 2015 5:15 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
Странно, но у мня на ноуте под W8.1 нет такой проблемы. Если подключил телек к HDMI, то сразу экран ноута гаснет, динамики встроенные отключаются, и все работает с телевизора. Правда, у меня и телек и ноут Samsung, может они договорились? :D
TV свисток под Андроидом тоже аналогично работает - такая маленькая хреновина, а заменяет целый компьютер.

_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс мар 01, 2015 7:11 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Тут вся фишка как раз и заключается в словах
kvitaliy писал(а):
Если подключил телек к HDMI

Проблемы начинаются когда кабель HDMI постоянно воткнут в комп. У супруги на ноуте я тоже такое наблюдал, при втыкании шнура HDMI звук переключается на ТВ, правда экран ноута не гаснет.

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс мар 01, 2015 7:24 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
pablov писал(а):
Тут вся фишка как раз и заключается в словах
kvitaliy писал(а):
Если подключил телек к HDMI

Проблемы начинаются когда кабель HDMI постоянно воткнут в комп. У супруги на ноуте я тоже такое наблюдал, при втыкании шнура HDMI звук переключается на ТВ, правда экран ноута не гаснет.

Ну это может. У меня постоянно только TV свисток воткнут, ибо для того и куплен. Целый комп для телевидения держать постоянно включенным - это барство :D

_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс мар 08, 2015 1:42 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
kvitaliy писал(а):
TV свисток под Андроидом тоже аналогично работает - такая маленькая хреновина, а заменяет целый компьютер.

А можно про свисток поподробнее, сперва не обратил внимания на это.

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс мар 08, 2015 8:27 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
pablov писал(а):
kvitaliy писал(а):
TV свисток под Андроидом тоже аналогично работает - такая маленькая хреновина, а заменяет целый компьютер.

А можно про свисток поподробнее, сперва не обратил внимания на это.

Мини компьютер на Андроид. Подключается к телевизору по HDMI, интернет ловит по WiFi от роутера. Сейчас цена от $40-$50, очень демократично. Ресурсов в виде электричества почти не ест, на форуме 4PDA описано много таких устройств, и куча программ. Там же есть и программа торрент телевидение для Андроид, или на сайте самого торрент TV клиента. Из коробки показывает все Интернеты, включая Ютюб. Ставится любые программы телевизионные, например от Билайна, без всякого торента, напрямую идут каналы, правда платно, от 5 руб в сутки. Есть и бесплатные ест-но.
Внешний вид есть тут Или тут

Управляется с мышки беспроводной ( клавиатурой тоже можно, но барство!), или можно заказать чудопульт-клавиатуру , что я и сделал.

Кстати, играются все приставочные игры,на какие только есть эмуляторы на Андроид. А есть практически все, включая DOS, Спектрум, Sega и т.д. и т.п. На моём 47" экране телевизора смотрится шикарно :D
Я уже всех родственников одарил такими штуками, ну кто конечно шарит в компах хоть немного и имеет Интернет + телевизор

_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс мар 08, 2015 9:01 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Ха, интересная штуковина
И что, вы Виталий хотите сказать, что этот ваш свисток за 2500 руб. будет показывать все те 400 каналов, без использоания компа? научите...

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс мар 08, 2015 10:53 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
pablov писал(а):
Ха, интересная штуковина
И что, вы Виталий хотите сказать, что этот ваш свисток за 2500 руб. будет показывать все те 400 каналов, без использоания компа? научите...

Ветка на форуме 4PDA
Конкретно работа зависит от версии Андроид, самого устройства, но с 4.хх работает, вроде с 5-й есть проблемы, но я лично свистков с этой новейшей версией не встречал.
В общем почитай, там есть всё, что надо.
И ещё тут конкретные программы с оф.сайта

_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб мар 21, 2015 11:57 pm 
Не в сети
док

Зарегистрирован: Пн авг 13, 2012 3:19 pm
Сообщений: 80
Благодарил (а): 7 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
После подключения наушников к аудиовыходу монитора у меня приложение начало падать при старте. Полез разбираться, в итоге делюсь версией с фиксом:
  • добавил проверку результата вызова deviceEnumerator\GetDefaultAudioEndpoint() в ф-циях EnumAudioDevicesRender() и EnumAudioDevicesCapture() (суть фикса, собственно)
  • добавил SetForegroundWindow_() при отображении формы (ибо задолбало, что окно было не в фокусе после отображения)
  • исправил пару опечаток в исходнике
  • оформил всё в виде проекта
  • имел наглость повысить номер версии с 0.1 до 0.2 ;)

upd:
  • в тултипе у иконки в трее и в меню теперь вместо полных выводятся короткие названия устройств
  • добавил к иконке exe-шника размер 16x16


Вложения:
dAd_v0.2.zip [135.31 KiB]
Скачиваний: 112


Последний раз редактировалось pwd Вс мар 22, 2015 9:09 pm, всего редактировалось 1 раз.
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс мар 22, 2015 3:04 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
pwd писал(а):
[*] имел наглость повысить номер версии с 0.1 до 0.2 ;)

Ну что я могу сказать - это здорово! В этом вся прелесть опен соурсе
Только надо было учесть мое сообщение во втором посту и для меню в трее выводить короткие названия устройств (у одного товарища название зв. карты было оочень длинное и меню растягивалось на пол экрана)
я вот так это оформил
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Procedure EnumAudioDevicesRender()
 Protected deviceEnumerator.IMMDeviceEnumerator
 Protected keyDeviceDesc.PROPERTYKEY, keyIconPath.PROPERTYKEY, keyDeviceDescShort.PROPERTYKEY
 Protected hr, pwstrId, pwstrIdDefoult
 Protected pv.PROPVARIANT
 Protected ppDevices.IMMDeviceCollection, defaultDevice.IMMDevice, ppProperties.IPropertyStore
 Protected ppDevice.IMMDevice
 Protected.i Dim phicon(1)
 
 MoveMemory(?PKEY_Device_DeviceDesc, @keyDeviceDesc, SizeOf(GUID))     ; Заполняем структуру PROPERTYKEY для названия устройства    
 keyDeviceDesc\pid = $0E                                               ; Если 2, то имя устройства будет коротким, если $0E - полным, подсмотрел в отладчике    
 
 ;***************************** Для короткого названия устройства ***********
 MoveMemory(?PKEY_Device_DeviceDesc, @keyDeviceDescShort, SizeOf(GUID))  
 keyDeviceDescShort\pid = 2                                                
 ;***************************************************************************
 
 
 MoveMemory(?PKEY_DeviceClass_IconPath, @keyIconPath, SizeOf(GUID))    ; Заполняем структуру PROPERTYKEY для для пути к mmres.dll с иконкой устройства  
 keyIconPath\pid = $0C                                                 ; х.з почему $0C, подсмотрел в отладчике
 
 hr = CoInitialize_(0)
 If hr = #S_OK
   If CoCreateInstance_(?CLSID_MMDeviceEnumerator, #Null, #CLSCTX_INPROC_SERVER,
                        ?IID_IMMDeviceEnumerator, @deviceEnumerator) = #S_OK  ; Получаем указатель на методы интерфейса IMMDeviceEnumerator
      If  deviceEnumerator\EnumAudioEndpoints(#eRender, #DEVICE_STATE_ACTIVE, @ppDevices) = #S_OK ;  | #DEVICE_STATE_NOTPRESENT
            deviceEnumerator\Release()
          ; ###############  Получаем устройство по умолчанию ####################################
            deviceEnumerator\GetDefaultAudioEndpoint(#eRender, #eMultimedia, @ppDevice)
            ppDevice\GetId(@pwstrIdDefoult)
            ppDevice\Release()
          ; ######################################################################################      
         If ppDevices\GetCount(@CountDevices) = #S_OK
           If CountDevices                              ; Количество активных устройств в системе
             ; Перечисляем все активные аудио устройства в системе    
             For i = 0 To CountDevices - 1
               If ppDevices\Item(i, @ppDevice) = #S_OK     ; Получаем указатели на методы интерфейса IMMDevice
                 AddElement(strPlayBackDevices())  
                 ppDevice\GetId(@pwstrId)                  ; Получаем указатель на строку идентификатора устройства
;                Debug PeekS(pwstrId)
                 If pwstrId
                    GetHandle = RegOpenKeyEx_(#HKEY_CURRENT_USER, "SOFTWARE\DefaultAudioDevice\" + Right(PeekS(pwstrId), 38), 0, #KEY_ALL_ACCESS, @hKey)
                    If GetHandle <> #ERROR_SUCCESS
                       Reg_CreateKey(#HKEY_CURRENT_USER, "SOFTWARE\DefaultAudioDevice\" + Right(PeekS(pwstrId), 38))
                    Else  
                       strPlayBackDevices()\hotkey  = Val(Reg_GetValue(#HKEY_CURRENT_USER, "SOFTWARE\DefaultAudioDevice\" + Right(PeekS(pwstrId), 38), "HotKey"))
                       strPlayBackDevices()\hotkeyS = Reg_GetValue(#HKEY_CURRENT_USER, "SOFTWARE\DefaultAudioDevice\" + Right(PeekS(pwstrId), 38), "HotKeyS")
                    EndIf
                    strPlayBackDevices()\modname = PeekS(pwstrId)
                    If ppDevice\OpenPropertyStore(#STGM_READ, @ppProperties) = #S_OK  ; Получаем указатель на методы интерфейса IPropertyStore
                                                                                      ; нас интересует метод GetValue  
                       ppDevice\Release()
                       ppProperties\GetValue(keyDeviceDesc, @pv)          ; Название девайса      
                                  ;            Debug PeekS(pv\vt3)
                       strPlayBackDevices()\descr = PeekS(pv\vt3)
                       ppProperties\GetValue(keyDeviceDescShort, @pv)     ; Короткое название девайса      
                                ;              Debug PeekS(pv\vt3)
                       strPlayBackDevices()\shortdescr = PeekS(pv\vt3)
                       ppProperties\GetValue(keyIconPath, @pv)            ; Путь к DLL c иконками
                       GetIco(phicon(), PeekS(pv\vt3))
                       strPlayBackDevices()\LargeIco = phicon(0)
                       strPlayBackDevices()\SmallIco = phicon(1)
                       PushListPosition(strPlayBackDevices())
                       ForEach strPlayBackDevices()
                         If strPlayBackDevices()\modname = PeekS(pwstrIdDefoult)
                            strPlayBackDevices()\defaultdevice = 1
                            Break
                         EndIf  
                       Next
                       PopListPosition(strPlayBackDevices())
;                      Debug "-----------------------------------"
                       ppProperties\Release()
                     EndIf
                 EndIf
               EndIf
             Next
          EndIf
         EndIf
      EndIf
   EndIf  
     CoUninitialize_()
EndIf
 
EndProcedure


В структуру DAD надо добавить переменную
Цитата:
shortdescr.s ; Короткое название устройства

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс мар 22, 2015 9:10 pm 
Не в сети
док

Зарегистрирован: Пн авг 13, 2012 3:19 pm
Сообщений: 80
Благодарил (а): 7 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Обновил аттач в посте выше.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс апр 12, 2015 5:57 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Сделал несколько изменений
1. Запуск возможен только в OS Vista и выше
2. Использовал стандартный гаджет ShortcutGadget, я то олень изобретал велосипед, а он оказывается давно изобретен. Чесслово не знал. Правда по этому гаджету тоже есть замечания. Значения модефикаторов отличаются от M$, нет функционала считывать текстовое значение ShortcutGadget
3. Еще чего-то по мелочам поправил
ADD исправил ошибку


Вложения:
dAd_.rar [109.85 KiB]
Скачиваний: 123

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение
Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB