Как «Усиление микрофона» включить программно

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Как «Усиление микрофона» включить программно

Сообщение Teranas » 01.11.2016 (Вт) 6:01

Первая мысль проверить, какая из программ меняет эти настройки, это можно сделать, натравив RegMon.exe на эти ключи реестра, там достаточно гибкая система фильтрации.
Но, что-то мне подсказывает, что этим проблема не будет решена.
Я бы просто запретил менять настройки данной ветки в реестре, просто ограничив права, только на чтение и проблемы больше вообще не будет. Любая программа будет упираться в невозможность изменить данную настройку легально, а если это вирус или программа западло от студентов, то это другая тема…
Изображение
С уважением, Андрей.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как «Усиление микрофона» включить программно

Сообщение Vova_2581 » 01.11.2016 (Вт) 10:56

Teranas писал(а):Первая мысль проверить, какая из программ меняет эти настройки, это можно сделать, натравив RegMon.exe на эти ключи реестра

Легко сказать... А как тут установить фильтр реестра именно нужной ветки? Я не знаю, как это делается.
Изображение
Насчет "западло" студентов - это навряд ли. Получается так, что студенты как бы сами себя будут бить по затылку. :) То есть влазить... менять... а потом вызывать нас, чтобы пожаловаться, что нихрена не слышно. Бессмыслица какая-то! :lol: Да и к тому же студенты разбиты на небольшие группы и у каждой группы у компьютера с ними сидит руководитель (преподаватель). Так что это маловероятно вообще и вирусы тоже... мы все проверяем регулярно.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как «Усиление микрофона» включить программно

Сообщение Sam777e » 05.11.2016 (Сб) 1:00

Как говорится, желаю, чтобы все! // Булгаков, цитата

Вопрос интересный и в массовом сознании далеко не простой:
1. человеку очень надо

2. у меня WXP SP2, ноутбук ASUS, железо старое 5 - 10 лет, Realtek HD Audio, Excel 2003. Вдруг, иногда, стал пропадать звук; я, не слишком обоснованно, связал это с просмотром совершенно невинных вещей [ типа первенство мира по шахматам блиц ] в YouTube - а как бороться - не знаю до сих пор. Вот, надеялся, что в процессе работы что-либо прояснится // в данную минуту - нет, не ...

Вежливо прошу меня не пинать:
1. я сам прекрасно знаю очень низкую цену моих знаний, навыков, возможностей; да, я знаю, что очень надо обязательно обрабатывать ошибки, коды возврата ...

2. приведенный код служит не образцом "как надо делать", а просто - оторвал кусок не очень чистой тряпки и пытаюсь перевязать рану товарищу.

3. приведенный код является плодом долгих и мучительных [ а без мук счастья не бывает ] - абсолютное незнание предмета, невладение английским, ошибки [ старости и не только ] при кодировании ... - попыток [ медленного продвижения вперед - в сторону - назад - ... ] разобраться хоть немного и получить нечто очень приблизительно работающее.

4. да и вообще - я код только долго подрабатывал для этого конкретного случая, он весь солянка сборная из многочисленных интернет-источников. Среди них были замечательные http://www.qsl.net/i2phd/mixer/ - но языки.. не русский. В частности, в одной из статей прямо говорится, что API Audio Mixer - одна из самых запутанных частей - надо полагать, для простого юзера, а не для настоящего профи:
The Mixer API is one of the most complicated APIs regarding Windows multi-media. Наберусь сил и найду время - дам несколько ссылок.
Audio Mixer Functions Demo
http://www.codeproject.com/Articles/3094/Audio-Mixer-Functions-Demo

Важно: надо хорошо понимать, что пресловутые Audio Control'ы не обязаны быть обычными GUI контролами; возможно, что некоторые из них вообще не имеют визуального представления. Например, мне показалось, что на аналогичной показанной на стартовой картинке [ вверху-слева ] ситуации // только не для input, а для output // управление громкостью часть "Общая" хотя выглядит как два контрола-ползунка [ Громкость и Баланс ] , на самом деле является одним Audio Control 'ом Volume.

Увидел удивительную ситуацию:
1. вызов [ с успешным кодом возврата ] mixerGetControlDetails
НЕ формирует в details значения; я специально ставил там разные числа и они оставались неизменными.

2. вызов [ с успешным кодом возврата ] mixerSetControlDetails
НЕЗАВИСИМО от посылаемого в details значения - хоть Clng(True), хоть Clng(False) приводит к вожделенному появлению галочки в нужном чек-боксе ??!!. А если она там уже была, то ничего не меняется.

Короче, автору темы удачных экспериментов. Однако, должен заметить, что я не очень понимаю способ использования этой отмычки - что, просто по timer'у все время устанавливать сей флажок?

Сначала писал перечислитель самостоятельно [ попутно читая и перечитывая лекцию Хакерa ], получалось не очень; в конце концов нашел в сети очень подходящий код https://www.experts-exchange.com/questions/10020785/How-to-write-an-equalizer.html [ 1997-08-22, Visual Basic < 5 ! а до сих пор в сети полно топиков на эти темы ] и заставил его работать. Потом, исходя из принципа "Не навреди" исключительно долго и закипая от злости пытался узнать значение флажка с помощью mixerGetControlDetails - блин, блин и еще раз. Замечу, что в это время я уже совершенно свободно узнавал / менял значения уровней воспроизведения - то есть, сейчас у меня впечатление, что этот флажок - какой-то вырожденный случай. Но все сказанное надо делить на величину моей некомпетентности.

Кстати, когда менял уровни звучания при помощи mixerSetControlDetails, то работал стандартный Проигрыватель Windows Media и громкость сразу менялась, а не просто инфа записывалась в реестр.


А вообще, для моей деятельности у меня давным-давно сложился образ - это нечто современное ?? и по мере сил несколько более осмысленное занятие типа

"пытались овладеть способом управления машинами. Методы при этом использовались чисто варварские. Преступников заставляли тыкать пальцами в отверстия, кнопки, клавиши, запускать руки в двигатели и смотрели, что при этом происходит. Чаще всего не происходило ничего. Часто машины взрывались. Реже они начинали двигаться, давя и калеча всех вокруг. И совсем редко удавалось заставить машины двигаться упорядоченно. В процессе работы стражники садились подальше от испытываемой машины, а преступники бегали от них к машине и обратно, сообщая, в какую дыру или в какую кнопку будет сунут палец. Все это тщательно заносилось на чертежи."

@Хакер
Желаю здоровья и успешного разруливания всех дел!
Вложения
Mixer-Microphone.RAR
ВНИМАНИЕ!! Я сильно не уверен в чистоте моего компьютера !
(24.44 Кб) Скачиваний: 209
Последний раз редактировалось Sam777e 22.11.2016 (Вт) 15:13, всего редактировалось 1 раз.
Здоровья и удачи

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как «Усиление микрофона» включить программно

Сообщение Vova_2581 » 05.11.2016 (Сб) 23:40

АХРЕНЕТЬ!! Sam777e – Вы ГЕНИЙ!!! Все работает!! Я в шоке! :D Правда, оговорюсь сразу, тут получается такая ситуация: я подключил Ваш модуль к проекту, запустил... и CheckBox «Усиление микрофона» действительно устанавливался по команде, но почему-то этот метод работает только на звуковой плате... конкретно у меня Creative Sound Blaster PCI – там все работает четко. А вот когда я переключился на интегрированный в материнку звуковой кодек Vinyl AC 97 Audio (WAVE), то эта команда уже не работала. Я заметил, что в настройках звуковой платы, есть параметр «Усиление микрофона», а в интегрированном кодеке уже другое обозначение того же самого, а именно - "20dB boost" – как я и говорил, названия одного и того же параметра могут быть абсолютно разные в зависимости от кодека и драйверов на звук. Потом я залез в сам код модуля и нашел там вот такую строчку...
Код: Выделить всё
If Not s(strucMixerControl.szName) = "Усиление микрофона" Then GoTo NextControl

заменил на...
Код: Выделить всё
If Not s(strucMixerControl.szName) = "20dB boost" Then GoTo NextControl

но это не помогло strucMixerControl.szName упорно возвращал "Усиление микрофона" в своем значении.
Sam777e Вы правильно написали, что Mixer она из самых запутанных хреней! Потому я не знаю почему так работает в данном случае, но это у меня дома так все настроено, поэтому не спешите париться с этой всей фигней. Мне это надо не дома, а на работе! А на работе интегрированный кодек с надписью "Усиление микрофона" в параметрах – все как положено. Сейчас выходные, поэтому я не могу ничего сказать, как это все будет работать у нас на рабочих компьютерах. С недели испытаю и отпишусь. Но, тем не менее, Sam777e, СПАСИБО(!) Вам за такой нелегкий проделанный Вами путь и желание мне помочь. СПАСИБО!

...приведенный код служит не образцом "как надо делать", а просто - оторвал кусок не очень чистой тряпки и пытаюсь перевязать рану товарищу.


Мою израненую рану!??.. перевязать грязной тряпкой?!!... ???... Sam777e, за что Вы меня так не любите??? :shock: :)

Однако, должен заметить, что я не очень понимаю способ использования этой отмычки - что, просто по timer'у все время устанавливать сей флажок?


Да нет... не нужно никакого таймера. Вот сейчас уже все угомонилось... а то какое-то время, то на одной машине усиление выключится почему-то, то на другой, мы сами не можем понять, почему это вдруг стало происходить. «Западло» от студентов отпадает сразу, я уже говорил почему... выше. Сейчас пока все тихо. Просто пришла такая идея, если причину мы так и не установим и это будет постоянно приключаться и подрывать учебный процесс, я хотел написать небольшую программку, которая будет в авторане запускаться и проверять бит «Усиления микрофона», если он опять сброшен, то устанавливать его, без нашего участия, а то мы какое-то время забегались этой херней заниматься. Достаточно ОДИН раз установить и все!.. больше не трогают. НО пока перейдешь по всем этим настройкам и доберешься до этого параметра – просто задалбливает, если честно. А если Хакер сделает новый Mixer, где все будет сразу в одной панели и «Воспроизведение» и «Запись» со всеми настройками и прочее, так это просто находка! :D Вот... ждем готового проекта от Хакера. Но и Ваш модуль тоже нужен. Может придется когда-то делать как я написал... на автомате...

И последнее... Sam777e, а зачем Вы в архив вставили Экселевский файл??? Я его как запустил, так офис мне чуть барабанные перепонки не порвал, криками, что там... сидит страшный престрашный макрос!! Говорит: только попробуй мне его запустить... я, говорит, тебе всю пасть порву и маргала выколю. Понял?!!.. Вот так вот прямо и говорит! :( Короче, я испугался сильно, не стал ничего запускать, тем более, что Вы сами написали, что сомневаетесь в чистоте своего ПК. Я решил с модулем поработать. Если все заработает... обязательно применим... даже хотя бы с той целью, чтобы быстрее включать это усилитель, когда надо. :) Спасибо за модуль! :)

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как «Усиление микрофона» включить программно

Сообщение Sam777e » 06.11.2016 (Вс) 0:32

Спасибо за лестную и столь эмоциональную оценку.

1. У меня нет VB, поэтому все приходится делать внутри Excel`я. А настроенная система безопасности всегда бдит и предупреждает.

2. О кодеке Vinyl AC 97 Audio (WAVE).
Мои предположения.

Вы, возможно, не обратили внимания на строку

Код: Выделить всё
If Not s(strucMixerLine.szName) = "Микрофон" Then GoTo NextSourceLine


Естественно, поиск находит связанную со звуковой платой Линию с именем "Микрофон" и контрол "Усиление микрофона" ...

Менять надо константы в этих двух местах:

Код: Выделить всё
If Not s(strucMixerLine.szName) = "Микрофон" Then GoTo NextSourceLine
...
If Not s(strucMixerControl.szName) = "Усиление микрофона" Then GoTo NextControl

на

Код: Выделить всё
If Not s(strucMixerLine.szName) = "Microphone" Then GoTo NextSourceLine
...
If Not s(strucMixerControl.szName) = "20dB boost" Then GoTo NextControl

По идее, должно заработать. На всякий случай - можно использовать UCase ...

"Доброй охоты всем нам! – ответил он."
Здоровья и удачи

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как «Усиление микрофона» включить программно

Сообщение Vova_2581 » 10.11.2016 (Чт) 16:07

Я извиняюсь... сейчас пока не могу ничего проверить по причине того, что на работе у нас началась реорганизация оборудования, так что пока заняты очень этим делом и возможности нет, поэтому придется немного подождать.
Что касается внутреннего кодека Vinyl AC 97 у меня дома... то Вы абсолютно правы... только не "Microphone", а просто "Mic". Дома проблем нет - все работает на всех устройствах! Ну а на работе... уже наверное со следующей недели все решиться, тогда и напишу.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как «Усиление микрофона» включить программно

Сообщение Vova_2581 » 25.11.2016 (Пт) 11:22

Извините, что заставил долго ждать... сами понимаете работа... В общем, я все проверил и потестировал, результаты такие: дома все работает идеально, а вот на работе, к сожалению, почему-то не работает. :( Я уже код трассировал сам и в зад и в перед, пытался понять, в чем проблема, но не получилось... Я не знаю в чем конкретно причина, но получается так, что если контрол «Усиление микрофона» находится в микшере «Воспроизведение» линии «Микрофон» - «Настройка», то программа его находит и устанавливает... а вот если, как у меня на работе, этот же самый контрол находится в микшере «Запись», то программа уже его не видит и не находит вообще, словно его и нет, хотя физически он есть и находится там. Почему так происходит не знаю. Я прикрепил видео ScreenCameraVideo того, что я делал и что получается... посмотрите сами... может кто знает ответ??? :roll:

«Нам не удалось сегодня подстрелить зайца, но нам никто не мешает продолжить охоту завтра!» - продолжил говорить он. :D

P.S.
А на работе на некоторых ПК я еще и такое чудо видел...
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Как «Усиление микрофона» включить программно

Сообщение alibek » 30.11.2016 (Ср) 21:43

Vova_2581 писал(а):А на работе на некоторых ПК я еще и такое чудо видел...

Самое время перечитать и понять пост #6785481.
Lasciate ogni speranza, voi ch'entrate.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как «Усиление микрофона» включить программно

Сообщение Sam777e » 01.12.2016 (Чт) 4:29

В полном согласии с Хакер и TheWatcher написал примитивный перечислитель.

На нужном компе запускаешь, получаешь текстовый файл с минимальной информацией об аудиосистеме на этом компе. Информация поможет понять где, что, и на что менять в предыдущем модуле.

Снова - это просто нечто работающее [ что и насколько понял / сумел ].

Но категорически подчеркиваю: все эти аудио_контролы суть объекты некоторой подсистемы Windows [ идеология которой описана в указанном выше посте ] - а как их и ижи с ними ОТОБРАЖАТЬ для обычного пользователя - дело программы [ например, sndvol32.exe ] и она хозяин - барин. Легко может быть, что один аудио_контрол показан нам двумя ползунками; или - вообще не показан, но он есть и программно с ним работать можно, используя Mixer API.
Вложения
Enumerate.RAR
(4.18 Кб) Скачиваний: 185
Здоровья и удачи

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как «Усиление микрофона» включить программно

Сообщение Vova_2581 » 01.12.2016 (Чт) 10:47

Sam777e
Я немножко переделал код модуля Enumerate, а то он на Exсel заточен. Вот... пожалуйста... извольтесссс убедиться... там тоже Усиления микрофона нет! Так что Sam777e Ваш код работает правильно, просто почему-то этого контрола у меня на работе в компьютерах никто не видит, кроме самого sndvol32.exe, хотя физически он есть. Что это за хрень такая не пойму??? :shock:

alibek
Вы бы лучше подсказали, где ошибка? А то... читай не читай, толку с того! :cry:
Вложения
Result-3.rar
Результат работы процедуры "EnumerateToFile_3" в модуле "EnumerateSmall.BAS" от TheWatcher...
(521 байт) Скачиваний: 181

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как «Усиление микрофона» включить программно

Сообщение Vova_2581 » 01.12.2016 (Чт) 10:52

Sam777e, ладно не получится... так не получится... что же тут поделаешь. По крайней мере спасибо Вам, что попытались помочь, я Вам очень признателен. :)

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как «Усиление микрофона» включить программно

Сообщение ger_kar » 02.12.2016 (Пт) 9:43

Vova_2581 писал(а):Вы бы лучше подсказали, где ошибка? А то... читай не читай, толку с того!
С прочтения толку не будет только в том случае, если это не приводит к пониманию. Поэтому нужно читать до тех пор, пока понимание не наступит. Что касается того топика Хакера, то его не просто нужно читать, а нужно еще и делать эксперименты. А в готовый код Sam777e при этом подглядывать. И читая топик и примеры кода добиться таки полного понимания происходящего.
Бороться и искать, найти и перепрятать

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как «Усиление микрофона» включить программно

Сообщение Vova_2581 » 02.12.2016 (Пт) 10:45

Вот скажите мне: чего это я в Вас такой влюбленный??? Я так люблю некоторых товарищей, которые любят умничать, а на деле пока еще НИ ОДИН из Вас не доказал, что он на что-то способен, кроме как чесать языком. Все чешут и только ОДИН Sam777e НА ДЕЛЕ доказывает, что он не балабол! Вы уж меня простите! Говорю, как есть. :roll:

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Как «Усиление микрофона» включить программно

Сообщение bon818 » 02.12.2016 (Пт) 21:42

Vova_2581 писал(а):а на деле пока еще НИ ОДИН из Вас не доказал, что он на что-то способен, кроме как чесать языком. Все чешут и только ОДИН Sam777e НА ДЕЛЕ доказывает, что он не балабол! Вы уж меня простите! Говорю, как есть. :roll:

С какой стати, кому то нужно вам, что то доказывать?
Те кому нечего доказывать не надо, не будут тратить на вас своё драгоценное время, изучая вашу проблему и поиск ее решения.
Так что пользуйтесь с благодарностью теми бесплатными советами, что дают и радуйтесь.
А если уж очень очень надо, что б за вас - вам, что то сделали, то перенесите тему в раздел работа.

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Как «Усиление микрофона» включить программно

Сообщение Teranas » 03.12.2016 (Сб) 2:15

ага, согласен с 818, накинули бы за проблему рублей 500, вот у людей и стимул появился бы
С уважением, Андрей.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как «Усиление микрофона» включить программно

Сообщение Sam777e » 03.12.2016 (Сб) 3:11

В чем-то да / не согласен со всеми, долго расписывать; вмешиваться не хочется.

@Teranas
Если Вы в Новосибирске, то готов днем уточнить нахождение [ там ] и координаты знакомой. Готов "накинуть" указанную сумму за ответ-разъяснение описанной выше ситуации

Sam777e писал(а):Увидел удивительную ситуацию:
1. вызов [ с успешным кодом возврата ] mixerGetControlDetails
НЕ формирует в details значения; я специально ставил там разные числа и они оставались неизменными.

2. вызов [ с успешным кодом возврата ] mixerSetControlDetails
НЕЗАВИСИМО от посылаемого в details значения - хоть Clng(True), хоть Clng(False) приводит к вожделенному появлению галочки в нужном чек-боксе ??!!. А если она там уже была, то ничего не меняется.


Подчеркиваю:
речь идет именно и исключительно о CheckBox 'е "Усиление микрофона" -
с программным двиганием ползунков громкости & баланса все обстоит совершенно "штатно" и это мне показывать совершенно не надо.

Если Вы [ и разъяснение - разумеется, с кодом ] готовы, то получите оплату через знакомую.

В любом случае, было бы интересно узнать Вашу [ примерную ] оценку времени, нужного Вам для решения задачи.
[ У меня с этим всегда проблема: думаю, что сделаю за полдня, а выходит через две недели - прямо по Черномырдину :-? ].

С уважением, Sam777e
Здоровья и удачи

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как «Усиление микрофона» включить программно

Сообщение Vova_2581 » 03.12.2016 (Сб) 13:57

bon818 писал(а):С какой стати, кому то нужно вам, что то доказывать?

Я ПРОШУ помочь, а не ТРЕБУЮ - узрите разницу! Если ваше время такое драгоценное, то пожалуйста не пишите сюда ничего, займитесь своими драгоценными делами и НЕ ЧИТАЙТЕ мой пост, очень большая просьба ко всем: НЕ ПИШИТЕ ничего сюда, если Вам нечего сказать или некогда. Я Хакера за язык не тянул, он сам предложил написать новый микшер, так вот и ждем... Мне это нужно, Вам нет, значит не участвуйте в обсуждении. Я никого не заставляю что-то делать. Просто ситуация смешная: я не разбираюсь особо в программировании (просто любитель), но мне это нужно для работы, а не просто так от делая нефиг... Мне трудно понять то, что написал Хакер потому что Я НЕ УЧИЛСЯ НА ПРОГРАММИСТА и именно потому обратился на этот форум к профессионалам, чтобы помогли делом, а меня отправляют перечитывать библиотеку Ленина. Представьте себе ситуацию: я работаю электронщиком, и вот вы приходите ко мне с вопросом, как любитель: Вова скажи: как мне трехфазный двигатель подключить к однофазной сети?? А я вместо того, чтобы за три минуты расчитать вам конденсатор смещения фазы, говорю: ну, Вам нужно сходить в библиотеку и прочесть там труды, например, профессора Круга по электротехнике, потом изучите общую теорию переменного тока и потом прочьтете Бессонова о теории основ электротехники и тогда, наверняка, вдруг "запляшут облака"... Смешно не правда-ли??? Как Вы на меня тогда посмотрите??? Это именно то, что делаете Вы! Так что не пишите, если Вам по фиг. Заранее спасибо за понимание. :D

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Как «Усиление микрофона» включить программно

Сообщение bon818 » 04.12.2016 (Вс) 1:36

Vova_2581 писал(а):Я ПРОШУ помочь, а не ТРЕБУЮ - узрите разницу! Если ваше время такое драгоценное, то пожалуйста не пишите сюда ничего, займитесь своими драгоценными делами и НЕ ЧИТАЙТЕ мой пост, очень большая просьба ко всем: НЕ ПИШИТЕ ничего сюда, если Вам нечего сказать или некогда.
Так что не пишите, если Вам по фиг. Заранее спасибо за понимание.


Прям так и не писать ))) Если закончили с упреками, то на здоровье.
Мне было по фиг, пока вы не сделали недовольное эмоциональное обращение ко всем кто посещает этот форум.
Вот я, как один из всех вам и ответил.
И читать я ваши посты буду, очень они мне нравится, особенно как вы здесь пытаетесь проехать на гнилой козе до финиша.
Vova_2581 писал(а):Я НЕ УЧИЛСЯ НА ПРОГРАММИСТА и именно потому обратился на этот форум к профессионалам, чтобы помогли делом

Если бы у кого были готовые наработки и он был готов ими поделится, то вам бы уже давно помогли делом.
А так, вам придется самому разбирать тему и потом делится результатом, а походу в помощь вам дают советы, как вникнуть в тему, а вы фыркаете.
Соглашайтесь на предложение Teranas, я бы например меньше $50 даже не заморачивался.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как «Усиление микрофона» включить программно

Сообщение Хакер » 04.12.2016 (Вс) 1:42

Vova_2581 писал(а):Я ПРОШУ помочь, а не ТРЕБУЮ - узрите разницу!

Ты просишь помочь, но при этом требуешь от помогающих соблюдать какие-то твои особенные требования относительно того, какой должна быть помощь.

Типа: я голодный, мне нечего есть, но прекратите уже давать мне свои чёртовы удочки, я согласен только на готовую пойманную и пожаренную рыбу.

Ты уясни, пожалуйста, что ты не имеешь никакого права запрещать людям писать сюда свои соображения и писать их в том объёме, в котором люди считают нужным или в каком им позволяет писать наличие у них свободного времени. Даже если тебе эти ответы не интересны, пора бы уже понять, что любой топик на форуме принадлежит не только создателю, а всему сообществу. И даже если тот, кто его создал, решил вскоре утопиться, топик и ответы не будут удалены, а обсуждение, возможно, будет продолжено, потому что есть ещё в мире люди, которых интересует этот вопрос или может заинтересовать в будущем, и которые придут в этот топик через год или два. Для этих людей ответы, которые тебя не устраивают, могут оказаться полезными.

Впрочем, и для тебя они могут оказаться полезными, если ты всё-таки выключишь лень и начнёшь думать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как «Усиление микрофона» включить программно

Сообщение Хакер » 04.12.2016 (Вс) 1:49

К тому же, отдельным сообщением хочу сказать, что я совершенно не понимаю, почему ты ожидаешь мой микшер? Судя по всему, тебе дали какой-то код, узкоспециализированный и заточенный на решение именно твоей проблемы. Но ты в нём не можешь разобраться. Тогда чем тебе поможет мой микшер, который не крутится вокруг управления усилением микрофона, где 80 процентов кода будет касаться вообще других вещей, того же пользовательского интерфейса, например.

В нём-то ты тем более не сможешь разобраться. Логично? И у тебя какая-то другая логика? Объясни.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как «Усиление микрофона» включить программно

Сообщение Vova_2581 » 05.12.2016 (Пн) 19:33

Давайте так... я вам завтра все напишу, у меня сейчас просто нет времени.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как «Усиление микрофона» включить программно

Сообщение Vova_2581 » 06.12.2016 (Вт) 20:17

И снова здрасьте! Ну, во-первых, хочу сразу сказать, что я нигде ни у кого ничего не требовал и уж тем более не запрещал. А к Вам у меня вообще, ну почти... :D никаких претензий не было, я только просил... так что не называйте меня чудаком, как в соседнем топике, и не перекручивайте мои слова. Я всех Вас люблю и уважаю, пишите, что хотите... :D

Ну раз уж Вы стали меня упрекать, то вот скажите: уважаемый TrueTrue из соседнего топика несколько раз сделал, примерно, такое же заявление, как и я... Позволю себе процитировать...
«Просто возьмите себе уже наконец за правило, знаете - посоветуйте, не знаете просто молчите и всё»
...
«Как же тут любят разглагольствовать не разобравшись. Неужели так сложно, просто подсказать если знаете ответ. А если не знаете, то просто промолчать»

Но Вы, при этом, почему-то ни разу(!) не назвали его чудаком, и не сказали ему про лень, а так же не сказали, что у него «особенные требования». А я вот Вам оказался душе не мил. Странно?! Ведь уважаемый TrueTrue в некотором смысле всем нам запрещает!.. говорит: «молчите!!..» :evil: и т.д. Это ведь напрямую противоречит изложенной Вами концепцией! Разве нет??!! :shock:

Во-вторых, мое, как Вы выразились «негодование», было вызвано тем, что в самом начале своего топика я просил дать мне хотя бы один пример... Вы толкнули мне теорию. Я сказал «Ок, спасибо, попробую разобраться», но разобраться не получилось.
Просто Вы никак не можете понять, что не всем дано и не все такие гениальные, как глубоко почтенный и уважаемый мною господин Sam777e, который смог теорию превратить в реальный код с примером – именно, то, что я и просил! Я не настолько гениален, увы. :roll:
Так вот, после Вас, другие... на вопрос: «подскажите, где ошибка в уже сделанном коде? Мы с Sam777e не можем понять...», упрямо адресуют на Вашу теорию.
Я им говорю:
- Ок, перезвоните попозже...» А мне:
- Прослушайте информацию еще раз...
Я говорю: - Ок. Спасибо, абонент занят, перезвоните попозже...
- Нет, - говорят, - нажмите «звездочку»... «решетка»... и прослушайте информацию еще раз...
- Ок! Спасибо. Абонент вне зоны доступа и вообще отключился от сервиса...
- Нет... извольте прослушать еще раз!..
И так по кругу. Как Вы думаете, что сделал я??? Правильно: разбил клавиатуру о монитор. Сейчас вот пишу мышкой на виртуальной клаве сквозь паутинки на экране. Извините за опечатки, если будут. :D

Хакер, ну вот Вы написали, что другие будут искать информацию и т.д. Скажите, пожалуйста, неужели Вы на самом деле свято верите, что все, кто будет в будущем посещать этот топик, станут разбираться в теории?? Я Вас умоляю! 99.999% даже не станут читать то, что мы тут с Вами пишем, а будут искать и скачивать себе готовые коды в приложениях. Я не прав??? Оторвите, пожалуйста, руку от мышки, приставьте ее к сердцу и торжественно признайтесь нам честно перед экраном своего монитора: когда Вы учились в институте и вам задавали задания по физике, Вы что сразу шли в библиотеку, находили там книги и особо тщательно изучали теорему вывода и теоретического доказательства дифференциального уравнения Шрёдингера в академическом изложении перед тем, как решить задачу??? Или Вы, как и 99% других искали готовые примеры решения задач с применением уравнения Шрёдингера?? Я думаю, ответ очевиден!

Насчет лени... скажу так: Вам, как профессионалам, написать функцию того, что мне надо (если Вы действительно профессионал и Вам не лень) не составит никакого труда вообще! А уж тем более займет по времени 15-20 минут от силы. Сейчас в арсенале программистов кучи вспомогательных механизмов типа AllAPI Network, API Viewer и прочие, используя которые любой код складывается по «кубикам» с небольшими изменениями. Или Вы хотите сказать, что Вашу программу за $50 Вы будете писать с нуля?? То есть с чистого листа??? :shock: Те, кто так пишут лукавят, и мы все это знаем. :D Не хотите – не пишите, я никого не заставляю, упаси Бог! Просто этим хотел сказать, что это не мне лень, а это Вам лень. Вот мне и пишут: «читай Хакера».

Да, мне сложно разобраться, я не программист, делаю, что могу. Лень тут не при чем, Вы просто представьте себе ситуацию... Обратился я к Вам с просьбой:
- Друзья, тут такое дело... блин... влюбился, голову сносит! Женюсь! А невеста хороша и фигура, и душа! Женюсь! Блин... Один раз и на всю жизнь, понимаете?! ОДИН раз женюсь (специально повторяю!). Нужна хорошая рыбка на свадьбу, гостей угостить, хорошую свадьбу сыграть. Ловить и жарить рыбу ни хрена не умею, но очень надо! Помогите! А?!..
И тут Вы мне отвечаете: «да пошел ты!.. купи себе удки и сам лови!». А некоторые пишут: «дай невестой попользоваться за $50 тогда рыбу дадим».
И единственный(!) среди всех глубоко почтенный и уважаемый господин Sam777e отвечает мне:
- Сушай, БРАТ... для такого дела мне ничего не жалко, возьми мою рыбку! Вчера ловил, свежая, сам жарил, очень вкусно, пальчики оближешь, да... Возьми рыбку, дорогой БРАТ! Единственное о чем прошу, БРАТ, помолись за мое здоровье!
А я почитал всех остальных и отвечаю ему:
- Не, БРАТ, твою рыбку не возьму. Я тут других послушал... Я в салон рыбака пойду, возьму книги по рыболовству, прикормки там разные фигли-мигли достану. Грохну на все это дело кучу бабла и времени не меряно. Перечитаю все, изучу тщательно, свадьбу отложу «до востребования». Потом куплю лодку надувную, заплыву на середину реки и три дня и три ночи под дождем и снегом золотую рыбу ловить буду. Поймаю вместо карпа и судака какую-то кильку, кое-как пожарю ее, она у меня подгорит, потому что ни хрена жарить не умею, и потом это гав-@#$%-но принесу гостям на свою свадьбу.
Посмотрит на все это уважаемый Sam777e и скажет мне:
- Ээээ, БРАТ, дорогой, мне кажется, тебе удочка не нужна, тебе врач нужна! :D
Ну вот, примерно, как-то так... :))

А про гнилую козу я вообще ничего не понял. bon818, Вы мне напомнили один анекдот из разговора профессора высшей математики со студентом:
- Профессор, ну не могу я разобраться в теории решения задачи, не могли бы Вы мне показать примеры решения этого уравнения??
А профессор ему и отвечает: Уууу, батенька, да у Вас лошадь хромая, Вам нужно срочно заменить торпедный ускоритель!
Студент: - Профессор, Вам не кажется, что у Вас чайник перегрелся??! :D

Ну вот не обижайтесь, пожалуйста, но при чем тут коза и баян???

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как «Усиление микрофона» включить программно

Сообщение Vova_2581 » 06.12.2016 (Вт) 20:18

Хакер писал(а):К тому же, отдельным сообщением хочу сказать, что я совершенно не понимаю, почему ты ожидаешь мой микшер?

Отдельным сообщением объясняю...
Вы правы, я действительно мало что пойму. Мне нужно вот то, что Вы тут написали...
Просто подумал, что нам тут... был бы очень удобен Ваш микшер, когда все будет вместе на экране... и лишено всех перечисленных Вами недостатков. А то Вы, наверное, видели мое видео?? Неудобно все! Пока доберешься до того, что нужно, задалбливает... Почти каждый день одни и те же операции. Просто люди меняются... одним добавь... другим убавь... То усиление пропадает, я все это рассказывал уже... Я рассчитывал даже просто на EXE-файл, не важно, главное чтобы все работало. Ну, опять-таки это просьба, а не требование. Не хотите – не делайте, Бог с Вами!

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как «Усиление микрофона» включить программно

Сообщение ger_kar » 06.12.2016 (Вт) 21:01

Vova_2581 писал(а):Скажите, пожалуйста, неужели Вы на самом деле свято верите, что все, кто будет в будущем посещать этот топик, станут разбираться в теории?? Я Вас умоляю! 99.999% даже не станут читать то, что мы тут с Вами пишем, а будут искать и скачивать себе готовые коды в приложениях. Я не прав???
Не прав. Вот например до этого топика я не имел не малейшего понятия, как этот микшер работает, можно было конечно искать информацию по крупицам. В MSDN можно найти описание отдельных функций, но Хакер описал именно концепцию в общем "как это работает". И в этом топике это есть самая ценная информация, потому что все изложено предельно понятно на нормальном русском языке. А уже примеры это как дополнение к теории. Имея знания теории любые примеры на эту тему становятся вполне понятными и их можно вполне понять. А можно вместо примеров воспользоваться тем же MSDN и читая описания функций сделать то что требуется. А ценность готового куска кода, без понимания как он работает практически нулевая, изменилось окружение (другой компьютер с измененным микшером) и все затык. Автор примера не имеет компьютера с таким окружением, а автор топика не хочет разобраться в работе примера и все - тупик. А для других полезность топика не том, что бы где то управлять микрофоном (это всего лишь мелкий частный случай), а в том чтобы можно было разобравшись с работой микшера сделать свое решение в том виде, в котором оно может потребоваться.
А что касается трудностей с пониманием работы, то всю задачу нужно разбивать на более мелкие подзадачи. И постепенно по крупицам картинка будет складываться как пазлы. Я написал свое видение. Кто то может с этим и не согласен.
Бороться и искать, найти и перепрятать

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как «Усиление микрофона» включить программно

Сообщение Sam777e » 06.12.2016 (Вт) 23:38

Сначала по сути, а потом свою искреннюю реакцию; перед этим не слишком внимательно пробежался по указующей статье HOWTO :: Как правильно задавать вопросы, но ... с одно стороны - я не дотягиваю, с другой - учили нас, что везде присутствуют противоречия ...

Меня смущают и поэтому интересуют ответы на некоторые вопросы.
Как писал, оригинал кода - не мой, я только упрощал его и подгонял к заданной ситуации.

Перечислитель на одном из компов топик-стартера не нашел усиления микрофона. Я внимательнее посмотрел на обе выдачи - его и свою. В обеих 2-ой контрол линии всегда без имени. В оригинальном коде еще парсится тип контрола; и вот в моей выдаче для 2-ого контрола линии выдается всегда parsed type = [ Uniform Custom ]! Стал приглядываться к коду. Почти везде длина структуры использует LenB, но есть места, где просто Len. Понять суть мне не дано, увы ... И, скорее всего, автор прав; хотя - он где-то в комментарии-пояснении пишет формулу длины структуры и мне показалось, что там какое-то смешение: часть выражения имеет отношение к символам, а часть к байтам // 1997 год.

Я попробовал [ несколько раз, сейчас уже не помню где и чем различались попытки, неаккуратен, каюсь], хорошо понимая, что весьма рискую, навести единообразие - хорошо, что результатом было только предложение отправить отчет о сломавшемся Excel 'e в Microsoft.

Тогда я в ответе-строке, которую возвращает mixerGetLineControls просто заменил все символы с кодом, меньшим 32 на пробел [ опять же - не помню Asc или AscB, скорее всего - оба варианта ]. Делал это из-за предположения, что Len / LenB могли привести к неверной стартовой точке начала порции информации по 2-ому контролу линии. Распечатал ответ-строку - нет, ничего нового.

И второе - странное поведение с Details, описанное мною в первом посте.

Вот, если кто сможет объяснить эти два вопроса, то буду очень благодарен.
Здоровья и удачи

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как «Усиление микрофона» включить программно

Сообщение Sam777e » 07.12.2016 (Ср) 2:11

Во первых, хочу сказать, почему я этим занимался. [ Про нужду топик-стартера я уже писал. Кстати, у него хороший образ свадьбы и так далее, я бы рекомендовал читать и перечитывать "до понимания".] Я истинно ленив, никаких своих дел не делаю - именно из-за лени. Но я наркоман, получаю огромный кайф от процесса узнавания / понимания. Конечно, сам мало что могу, но в редких случаях, как этот - с объяснением Хакер 'a и Google 'ом - мне кажется, что кое-что смогу понять-сделать. Пытаюсь; хотелось бы до понимания [ как писал alibek ], но получается до посинения - упирания в стенку. У меня есть приятель с философией "Если жить 300 лет, то любой может стать академиком". Я так не думаю, у меня кредо лузера и предпочитаю получить готовые, разжеванные знания.

@ alibek, Хакер и другим соответствующего уровня: Вы же действительно умные и хорошие люди, почему же Вы убираете из поля зрения неспособность кого-нибудь понять некоторые вещи? В которых они довольно сильно нуждаются? И, иногда, гуру поступают на сайте непоследовательно: сильно нахальным, не говорящим о действительной необходимости и подробностях ситуации рассказывают о битах, байтах, упаковке именно миллиона, почему далекая горная вершина в окне электрички "стоит на одном месте", а телеграфные столбы у железнодорожного полотна мелькают, даже не углядишь ... И даже угадывают/объясняют - а что джентльмену на самом деле нужно? А ему нужно то ли чего то большого и чистого, то ли как блондинке из анекдота угнать самолет и она, по совету подруги-блондинки номер 2, ждет, когда он будет далеко-высоко и станет маленьким.

Довлатов писал
Мне пришлось сказать ему:
— Есть кое-что повыше справедливости!
— Ого! — сказал Зарецкий. — Это интересно! Говорите, я вас с удовольствием послушаю. Внимание, господа! Так что же выше справедливости?
— Да что угодно, — отвечаю.
— Ну, а если более конкретно?
— Если более конкретно — милосердие...

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

ger_kar писал(а):Хакер описал именно концепцию в общем "как это работает". И в этом топике это есть самая ценная информация

Полностью согласен.

ger_kar писал(а): потому что все изложено предельно понятно на нормальном русском языке.

Не очень согласен - не все и не предельно [ насчет русского - тут я исключительно солидарен, ибо с иноземными у меня крайне плохо ].
Мне и вправду везло.
Только этого мало.

Мне, например, не хватило указания на то скромное обстоятельство, что добраться до sourceLine можно только через "старшую сестру", но хозяйку - destinationLine, а не прямо из Mixer'a-"устройства". Из нарисованной в посте схемы это было не видно.

ger_kar писал(а):А уже примеры это как дополнение к теории. Имея знания теории любые примеры на эту тему становятся вполне понятными и их можно вполне понять.

[ 'любые примеры на эту тему становятся вполне понятными и их можно вполне понять' - слабо похоже на отрывок из речи Кони или Плевако ;=)].
А вот великий математик Владимир Игоревич Арнольд любил цитировать небезызвестного Ньютона, который полагал, что "Примеры важнее правил". И подумайте сами, зачем нужны примеры? В первую очередь они показывают, откуда возникают вопросы, мотивацию, дают возможность понимания ситуации, потом - подходы к решению, и только потом обобщение, теория, задачи и снова примеры ...

ger_kar писал(а): воспользоваться тем же MSDN и читая описания функций сделать то что требуется.


У немцев есть пословица "В деталях спрятаны рога и копыта дьявола". Я понимаю ее так: издали, глобально смотришь - вроде человек, но, приглядевшись внимательнее, замечаешь детали - рога и копыта, и понимаешь, что не все так обычно и просто. Я очень старался понять написанное о MixerAPI в NSDN. A Вы? Первая головная боль [ буквально; так же и с готическим шрифтом ] - отсутствие "верблюда" в именах. Один венгр придумал венгерскую систему-префиксов, а другой [ или австриец? ] - мазохизм. Вот эти все имена в верхнем регистре - чистый мазохизм. Вторая: у меня нет слуха, с обычным уже плохо, с музыкальным - всегда, музыка, доставляющая почти всем кайф - не мое. Следовательно, я не знаю звуковых устройств и их органов управления ... и не могу понять [ даже на русском ] все эти флаги / типы, ...FADER... Структуры в NSDN малой/средней степени сложности; функции/идеологию понятно описал Хакер - но вот в довольно немалой системе констант / типов - рога и копыта. И все время, когда читал эти долбанные вещи в MSDN, возвращался к посту Хакера, как к глотку чистого воздуха. Мне совершенно не нужен микшер Хакера [ но для образца - с громадным удовольствием, если пойму ] - мне все время очень хотелось попросить Хакера кусочек его кода, отвечающего за перечисление - ведь, наверное, такая часть должна быть в его системе? А те 80% и более, которые делают GUI нет, не нужны. Замечу, что сообщение Хакера о давнем желании написать микшер и отклики на него - это не совсем по теме ответа на изначальный вопрос, через несколько постов Хакер сам [ косвенно ] это признал:
К тому же, отдельным сообщением хочу сказать, что я совершенно не понимаю, почему ты ожидаешь мой микшер?

А зачем было говорить
Кстати, давно хочу написать замену стандартному микшеру

На мой взгляд, это, ну ... несколько в сторону. Отдельно: при объяснении идеологии говорилось: `Каждый объект-микшер олицетворяет аудиоустройство` - так замену какому стандартному аудиоустройству ты хотел написать? А-а-а, оказывается, грамотные люди микшером называют также программу управления звуком ...; однако не все настолько грамотные и некоторое время блуждают в возникших трех [ ну ладно - в двух ] соснах и кричат "Ау! Помогите!"

И я сразу намекнул автору темы: а как, мол, Вы собираетесь применять это все?

Надеюсь, что никто не обидится; некоторая резкость, которая может казаться и "не по делу", и, даже, хамством - есть, есть. Но доля верного - тоже присутствует . А в целом, всех наших знатоков [ и даже особ, не очень приближенных к императору ] я весьма ценю и уважаю; среди прочего - не только за профессиональные достоинства.

Ладно, пора идти спать. Если не слишком сильно обругают за нелицеприятные слова [ и за длинноты / постороннее ], то потом, как-нибудь, продолжу.
Последний раз редактировалось Sam777e 08.12.2016 (Чт) 15:13, всего редактировалось 1 раз.
Здоровья и удачи

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как «Усиление микрофона» включить программно

Сообщение Sam777e » 08.12.2016 (Чт) 1:13

Всем самого хорошего!
ger_kar писал(а):вместо примеров воспользоваться тем же MSDN и читая описания функций сделать то что требуется

В случае с MixerAPI довольно трудно: должного (fluent = беглый, владеющий [ речью ]) понимания даже близко нет, а вариантов многовато. На мой взгляд, тут до получения реального продвижения требуется работы и удачи много, гораздо больше, чем в создании свойства-антагониста. И разбираться, по большому счету, надо с не слишком интересными деталями - суть то Хакер дал - и вот сидишь и думаешь: а какой прок мне будет, если я разберусь и чуть лучше пойму эти самые детали? Как это может повысить мой общий программисткий уровень? И насколько велика вероятность, что это знание пригодится в будущем? Живой пример со свойством класса [ UserControl 'a ] : 15 лет знаю, что значение хранят в private переменной - надо будет завтра писать класс, воспользуюсь этим знанием. А в случае с темой, разве что кайф от самой работы [ которая всегда полезна ], от узнавания/понимания нового и, конечно, от [ вероятной ] помощи попросившему ее - и по нужному ему делу, а не просто так.

ger_kar писал(а):А ценность готового куска кода, без понимания как он работает практически нулевая

Полностью согласен.

Только торопиться с подобными фразами не стоит:
ger_kar писал(а): изменилось окружение (другой компьютер с измененным микшером) и все затык.

Что такое - 'компьютер с измененным микшером' ? Измененное аудиоустройство? Там что, изменилась идеология работы с MixerAPI ? Или ты имеешь в виду "другую" программу-интерфейс-средство работы с аудиосистемой обычного юзера? А где в примерах [ моем или в сети ] есть хоть капелька взаимодействия с такой программой? Наоборот, все эти примеры показывают как можно написать свою собственную программу - с замечательным интерфейсом Хакера, или совсем без оного - кликнул на иконке, отработала и ушла, оставив птичку - вот, я уже сбойнул и сильно, потому что, как и все рядовые пользователи привык к GUI ... А на самом деле, программа просто изменила значение некоторого аудиоконтрола и нам дела нет видно это или не видно - нам бы слышно!

Вот этот самый момент привычки к совершенно необязательному соответствию один-к-одному перегруженного слова контрол и чего-то визуального очень мешал/затемнял; стандартная sndvol32.exe показывает вкладки, списки, чекбоксы и т.д. Вопрос для любознательных: если мы, отправляемся от вкладки Речь, доходим до усиления микрофона и ставим птичку - а потом переходим на вкладку Громкость и там добираемся до микрофона, то как там будут обстоять дела? Это тот же самый микрофон или нет? На компе микрофон один - sourceLine этого устройства одна? Возня со всем этим привела меня к выводу, что мелкомягкие "большевики" решили за нас, как нам будет удобнее-лучше и показывают нам несколько [ примерно ] одинаковых контролов на разных вкладках - имеют право, может, действительно, у разных линий свои контролы ... но из того, что видишь, прыгая с вкладки на вкладку, понимаешь, что где-то глубоко внутри эта программа sndvol32 меняет значения всех этих контролов [Усиление микрофона] разом на одно и то же значение.

Однако, начинаются новые сутки - пора спать.

@Vova_2581
Vova_2581 писал(а):Я думаю, ответ очевиден!

Я думаю, насчет Хакерa ответ действительно очевиден - глубоко убежден, что он то как раз был в библиотеке за несколько лет до лекции [ или читал личную книгу ]!

Всех благ.
Здоровья и удачи

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как «Усиление микрофона» включить программно

Сообщение ger_kar » 08.12.2016 (Чт) 9:06

Решил таки сделать перечислитель всего и вся, что содержится в миксере (для примера). При этом буду опираться на статью Хакера и MSDN, никакие примеры кода использовать не буду. Просто ради эксперимента. Начал делать и сразу вспомнил недавно прочитанное:
Sam777e писал(а):Стал приглядываться к коду. Почти везде длина структуры использует LenB, но есть места, где просто Len. Понять суть мне не дано, увы ...
Чтобы сразу прояснить ситуацию решил дать ответ на этот момент. А суть тут в следующем. Вообще есть два вида структур использующих строки. В одних на строки есть только указатель, а сам строковый буфер идет отдельно, в других (например MIXERCAPS) сам строковый буфер входит в состав указанной структуры. Для второго варианта объявить такой буфер в составе структуры можно только таким способом szPName As String * MAXPNAMELEN ' product name и тут сразу надо вспомнить про то, что длина указывается в символах, а на хранение каждого символа VB6 отводит 2 байта. И далее у нас есть 2 варианта функций mixerGetControlDetailsA и mixerGetControlDetailsW. Для каждой из этих функций есть свой вариант структуры, разница между ними в том, что для одной используется текстовый буфер с 1 байтом на символ, а в другой 2 байта, и длина этих структур будет естественно разной.
При использовании mixerGetControlDetailsA функция ожидает структуру с текстовым буфером 1 байт под каждый символ и общий размер структуры. Структура в том виде, в котором она объявлена имеет 2 байта на символ, однако перед вызовом функции VB6 делает неявное преобразование и функция получает то что нужно, а вот передать правильно размер структуры - это уже задача программиста. Если использовать для определения размера LenB, то размер будет рассчитан неправильно, а вот если использовать Len, то размер структуры будет указан правильно (для структуры MIXERCAPS LenB=80, а Len=48), а функция получает то что ей нужно. Другой вариант - использование юникодных вариантов функций, при их использовании размер структуры нужно считать используя функцию LenB.
Если в структуре нет внутри текстового буфера, то можно применять LenB. Поэтому все зависит от применяемых функций и структур соответственно. Надеюсь пояснил понятно.
Бороться и искать, найти и перепрятать

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как «Усиление микрофона» включить программно

Сообщение Vova_2581 » 08.12.2016 (Чт) 11:48

Sam777e писал(а):А вот великий математик Владимир Игоревич Арнольд любил цитировать небезызвестного Ньютона, который полагал, что "Примеры важнее правил"

Вот видите!.. даже Ньютон тоже со мной согласен! :D
ger_kar писал(а):Решил таки сделать перечислитель всего и вся, что содержится в миксере (для примера).

Оооо! Кажется фортуна начинает мне улыбаться. Или это оскал?? Пока не пойму.
ger_kar писал(а):... Надеюсь пояснил понятно.

Вы знаете... впервые в жизни мне захотелось "застрелиться"! :D Я понял: насколько же я тупой. :D

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как «Усиление микрофона» включить программно

Сообщение ger_kar » 09.12.2016 (Пт) 8:36

Вот код изготовленный по мотивам статьи Хакера и по феншую от Microsoft под названием MSDN. Английский я почти не знаю, поэтому юзал OnLine переводчики от Google и https://www.bing.com/translator
Код: Выделить всё
Option Explicit

'[КОНСТАНТЫ И ПЕРЕЧИСЛЕНИЯ WIN API]
    '
    Private Const MAXPNAMELEN                   As Long = 32
    Private Const MIXER_LONG_NAME_CHARS         As Long = 64
    Private Const MIXER_SHORT_NAME_CHARS        As Long = 16
    '
    Private Const MMSYSERR_BASE                 As Long = 0
    Private Const MMSYSERR_ALLOCATED            As Long = (MMSYSERR_BASE + 4)
    Private Const MMSYSERR_BADDB                As Long = (MMSYSERR_BASE + 14)
    Private Const MMSYSERR_BADDEVICEID          As Long = (MMSYSERR_BASE + 2)
    Private Const MMSYSERR_BADERRNUM            As Long = (MMSYSERR_BASE + 9)
    Private Const MMSYSERR_DELETEERROR          As Long = (MMSYSERR_BASE + 18)
    Private Const MMSYSERR_ERROR                As Long = (MMSYSERR_BASE + 1)
    Private Const MMSYSERR_HANDLEBUSY           As Long = (MMSYSERR_BASE + 12)
    Private Const MMSYSERR_INVALFLAG            As Long = (MMSYSERR_BASE + 10)
    Private Const MMSYSERR_INVALHANDLE          As Long = (MMSYSERR_BASE + 5)
    Private Const MMSYSERR_INVALIDALIAS         As Long = (MMSYSERR_BASE + 13)
    Private Const MMSYSERR_INVALPARAM           As Long = (MMSYSERR_BASE + 11)
    Private Const MMSYSERR_KEYNOTFOUND          As Long = (MMSYSERR_BASE + 15)
    Private Const MMSYSERR_LASTERROR            As Long = (MMSYSERR_BASE + 13)
    Private Const MMSYSERR_MOREDATA             As Long = (MMSYSERR_BASE + 21)
    Private Const MMSYSERR_NODRIVER             As Long = (MMSYSERR_BASE + 6)
    Private Const MMSYSERR_NODRIVERCB           As Long = (MMSYSERR_BASE + 20)
    '
    Private Const MMSYSERR_NOERROR              As Long = 0
    Private Const MMSYSERR_NOMEM                As Long = (MMSYSERR_BASE + 7)
    Private Const MMSYSERR_NOTENABLED           As Long = (MMSYSERR_BASE + 3)
    Private Const MMSYSERR_NOTSUPPORTED         As Long = (MMSYSERR_BASE + 8)
    Private Const MMSYSERR_READERROR            As Long = (MMSYSERR_BASE + 16)
    Private Const MMSYSERR_VALNOTFOUND          As Long = (MMSYSERR_BASE + 19)
    Private Const MMSYSERR_WRITEERROR           As Long = (MMSYSERR_BASE + 17)
    '
    Private Const MIXER_GETCONTROLDETAILSF_LISTTEXT     As Long = &H1&
    Private Const MIXER_GETCONTROLDETAILSF_QUERYMASK    As Long = &HF&
    Private Const MIXER_GETCONTROLDETAILSF_VALUE        As Long = &H0&
    Private Const MIXER_GETLINECONTROLSF_ALL            As Long = &H0&
    Private Const MIXER_GETLINECONTROLSF_ONEBYID        As Long = &H1&
    Private Const MIXER_GETLINECONTROLSF_ONEBYTYPE      As Long = &H2&
    Private Const MIXER_GETLINECONTROLSF_QUERYMASK      As Long = &HF&
    '
    Private Const MIXER_GETLINEINFOF_COMPONENTTYPE      As Long = &H3&
    Private Const MIXER_GETLINEINFOF_DESTINATION        As Long = &H0&
    Private Const MIXER_GETLINEINFOF_LINEID             As Long = &H2&
    Private Const MIXER_GETLINEINFOF_QUERYMASK          As Long = &HF&
    Private Const MIXER_GETLINEINFOF_SOURCE             As Long = &H1&
    Private Const MIXER_GETLINEINFOF_TARGETTYPE         As Long = &H4&
    '
    Private Const MIXER_OBJECTF_MIXER           As Long = &H0&
    Private Const MIXER_OBJECTF_AUX             As Long = &H50000000
    Private Const MIXER_OBJECTF_HANDLE          As Long = &H80000000
    Private Const MIXER_OBJECTF_MIDIIN          As Long = &H40000000
    Private Const MIXER_OBJECTF_MIDIOUT         As Long = &H30000000
    Private Const MIXER_OBJECTF_WAVEIN          As Long = &H20000000
    Private Const MIXER_OBJECTF_WAVEOUT         As Long = &H10000000
    Private Const MIXER_OBJECTF_HMIDIIN         As Long = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIDIIN)
    Private Const MIXER_OBJECTF_HMIDIOUT        As Long = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIDIOUT)
    Private Const MIXER_OBJECTF_HMIXER          As Long = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIXER)
    Private Const MIXER_OBJECTF_HWAVEIN         As Long = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_WAVEIN)
    Private Const MIXER_OBJECTF_HWAVEOUT        As Long = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_WAVEOUT)
    '
    Private Const MIXERCONTROL_CT_CLASS_FADER       As Long = &H50000000
    Private Const MIXERCONTROL_CT_UNITS_UNSIGNED    As Long = &H30000
    Private Const MIXERCONTROL_CONTROLTYPE_FADER    As Long = (MIXERCONTROL_CT_CLASS_FADER Or MIXERCONTROL_CT_UNITS_UNSIGNED)
    Private Const MIXERCONTROL_CONTROLTYPE_VOLUME   As Long = (MIXERCONTROL_CONTROLTYPE_FADER + 1)


'[СТРУКТУРЫ WIN API]
    '
    '[MIXERCAPS]
        Private Type MIXERCAPS
            wMid            As Integer              ' manufacturer id
            wPid            As Integer              ' product id
            vDriverVersion  As Long                 ' version of the driver
            szPName         As String * MAXPNAMELEN ' product name
            fdwSupport      As Long                 ' misc. support bits
            cDestinations   As Long                 ' count of destinations
        End Type
       
    '[MIXERCONTROL]
        Private Type MIXERCONTROL
            cbStruct        As Long                 ' size Byte of MIXERCONTROL
            dwControlID     As Long                 ' unique control id for mixer device
            dwControlType   As Long                 ' MIXERCONTROL_CONTROLTYPE_xxx
            fdwControl      As Long                 ' MIXERCONTROL_CONTROLF_xxx
            cMultipleItems  As Long                 ' if MIXERCONTROL_CONTROLF_MULTIPLE set
            szShortName     As String * MIXER_SHORT_NAME_CHARS
            szName          As String * MIXER_LONG_NAME_CHARS
            IMinimum        As Long
            IMaximum        As Long
            Metrics(9)      As Long
        End Type
       
    '[MIXERCONTROLDETAILS]
        Private Type MIXERCONTROLDETAILS
            cbStruct        As Long                 ' size Byte of MIXERCONTROLDETAILS
            dwControlID     As Long                 ' control id to get/set details on
            cChannels       As Long                 ' number of channels paDetails array
            item            As Long                 ' hwndOwner or cMultipleItems
            cbDetails       As Long                 ' size of _one_ details_XX struct
            paDetails       As Long                 ' pointer to array of details_XX structs
        End Type
       
    '[Target]
        Private Type Target
            dwType          As Long                 ' MIXERLINE_TARGETTYPE_xxxx
            dwDeviceID      As Long                 ' target device ID of device type
            wMid            As Integer              ' of target device
            wPid            As Integer              ' "
            vDriverVersion  As Long                 ' "
            szPName         As String * MAXPNAMELEN
        End Type
       
    '[MIXERLINE]
        Private Type MIXERLINE
            cbStruct        As Long                 ' size of MIXERLINE structure
            dwDestination   As Long                 ' zero based destinationdex
            dwSource        As Long                 ' zero based sourcedex (if source)
            dwLineID        As Long                 ' unique line id for mixer device
            fdwLine         As Long                 ' state/information about line
            dwUser          As Long                 ' driver specificformation
            dwComponentType As Long                 ' component type line connects to
            cChannels       As Long                 ' number of channels line supports
            cConnections    As Long                 ' number of connections (possible)
            cControls       As Long                 ' number of controls at this line
            szShortName     As String * MIXER_SHORT_NAME_CHARS
            szName          As String * MIXER_LONG_NAME_CHARS
            lpTarget        As Target
        End Type
       
    '[MIXERLINECONTROLS]
        Private Type MIXERLINECONTROLS
            cbStruct        As Long                 ' size Byte of MIXERLINECONTROLS
            dwLineID        As Long                 ' line id (from MIXERLINE.dwLineID)
            '{Union                                        '
            dwControl       As Long                 ' MIXER_GETLINECONTROLSF_ONEBYID or MIXER_GETLINECONTROLSF_ONEBYTYPE
            '}
            cControls       As Long                 ' count of controls pmxctrl points to
            cbMxCtrl        As Long                 ' size Byte of _one_ MIXERCONTROL
            paMxCtrl        As Long                 ' pointer to first MIXERCONTROL array
        End Type


'[ФУНКЦИИ WIN API (Используются юникодные варианты функций!!!)]
    '
    '[mixerGetNumDevs]
        Private Declare Function mixerGetNumDevs Lib "winmm.dll" () As Long
       
    '[mixerGetDevCaps]
        Private Declare Function mixerGetDevCaps Lib "winmm.dll" Alias "mixerGetDevCapsW" ( _
            ByVal uMxId As Long, _
            ByVal pMIXERCAPS As Long, _
            ByVal cbmxcaps As Long _
            ) As Long
   
    '[mixerOpen]
        Private Declare Function mixerOpen Lib "winmm.dll" ( _
            ByRef phmx As Long, _
            ByVal uMxId As Long, _
            ByVal dwCallback As Long, _
            ByVal dwInstance As Long, _
            ByVal fdwOpen As Long _
            ) As Long
   
    '[mixerClose]
        Private Declare Function mixerClose Lib "winmm.dll" ( _
            ByVal hmx As Long _
            ) As Long
           
    '[mixerGetLineInfo]
        Private Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoW" ( _
            ByVal hmxobj As Long, _
            ByVal pMIXERLINE As Long, _
            ByVal fdwInfo As Long _
            ) As Long
       
    '[mixerGetLineControls]
        Private Declare Function mixerGetLineControls Lib "winmm.dll" Alias "mixerGetLineControlsW" ( _
            ByVal hmxobj As Long, _
            ByVal pMIXERLINECONTROLS As Long, _
            ByVal fdwControls As Long _
            ) As Long
           
    '[mixerGetControlDetails]
        Private Declare Function mixerGetControlDetails Lib "winmm.dll" Alias "mixerGetControlDetailsW" ( _
            ByVal hmxobj As Long, _
            ByVal pMIXERCONTROLDETAILS As Long, _
            ByVal fdwDetails As Long _
            ) As Long
   
    '[mixerGetID]
        Private Declare Function mixerGetID Lib "winmm.dll" ( _
            ByVal hmxobj As Long, _
            ByRef pumxID As Long, _
            ByVal fdwId As Long _
            ) As Long
   
    '[mixerMessage]
        Private Declare Function mixerMessage Lib "winmm.dll" ( _
            ByVal hmx As Long, _
            ByVal uMsg As Long, _
            ByVal dwParam1 As Long, _
            ByVal dwParam2 As Long _
            ) As Long

    '[mixerSetControlDetails]
        Private Declare Function mixerSetControlDetails Lib "winmm.dll" ( _
            ByVal hmxobj As Long, _
            ByRef pmxcd As MIXERCONTROLDETAILS, _
            ByVal fdwDetails As Long _
            ) As Long
    '

'[USER ENUM]
    '
    Public Enum OutType
         Hierarchy = 0
         List = 1
    End Enum
   

'[ПЕРЕМЕННЫЕ УРОВНЯ МОДУЛЯ]
    '
    Private m_OutputType   As OutType       'Тип вывода информации
    Private m_hMixer       As Long          'Хендл открытого микшера
    '


'[EnumDevice]
'========================================================================================================
'ПРОЦЕДУРА ПЕРЕЧИСЛЕНИЯ УСТРОЙСТВ
'========================================================================================================
Public Sub EnumDevice(ByVal OutType As OutType)
    '#[in]OutType                           'Тип вывода (Иерархический или список)
    Dim lStatus         As Long             'Статус вызова WinAPI функций
    Dim lDeviceNum      As Long             'Количество устройств
    Dim lDevId          As Long             'Идентификатор устройства
    Dim pMIXERCAPS      As MIXERCAPS
   
    m_OutputType = OutType
   
    '
    ' В этой процедуре перечисляются устройства микшера. Сначала получаем количество устройств в системе
    ' и цикле делаем их перебор. Для каждого найденного устройства вызывается процедура перечисления
    ' всех линий, которые это устройство содержит.
    '
   
    lDeviceNum = mixerGetNumDevs()
   
    'Перечисление устройств в цикле (отсчет идентификаторов от 0)
    For lDevId = 0 To lDeviceNum - 1
       
        'Получение данных устройства в структуру MIXERCAPS
        lStatus = mixerGetDevCaps(lDevId, VarPtr(pMIXERCAPS), LenB(pMIXERCAPS))
        If lStatus = MMSYSERR_NOERROR Then
            'Вывод полученного имени устройства и вызов перечислений для его линий
            If m_OutputType = Hierarchy Then Call PrintInfo(0, "Device - " & GetBSTR(pMIXERCAPS.szPName))
            Call EnumLine(lDevId, pMIXERCAPS.cDestinations)
        End If
       
    Next
   
End Sub


'[EnumLine]
'========================================================================================================
'ПРОЦЕДУРА ПЕРЕЧИСЛЕНИЯ ЛИНИЙ ДЛЯ ОТДЕЛЬНОГО УСТРОЙСТВА МИКШЕРА
'========================================================================================================
Private Sub EnumLine(ByVal lDevId As Long, ByVal lLineCount As Long)
    '#[in]lDevId                            'Идентификатор устройства
    '#[in]lLineCount                        'Количество линий устройства
    Dim lStatus         As Long             'Статус вызова WinAPI функций
    Dim lLineId         As Long             'Идентификатор линии
    Dim lConnect        As Long             'Номер соединения
    Dim pMxLine         As MIXERLINE
   
    '
    ' В этой процедуре перечисляются все линии одного устройства микшера.
    ' Перед работой с устройством его необходимо открыть, а после использования закрыть.
    ' Перечисляются все линии назначения (DESTINATION) по идентификатору (отсчет от 0)
    ' Для каждой линии (DESTINATION) вызывается процедура перечисления контролов и далее
    ' идет перечисление всех связанных с этой линией источников (SOURCE). Для каждой линии
    ' источника также вызывается процедура перечисления контролов связанных с ней.
    ' Линии источников идентифицируется полями структуры MIXERLINE (.dwDestination и .dwSource)
    '
   
    lStatus = mixerOpen(m_hMixer, lDevId, 0, 0, MIXER_OBJECTF_MIXER)
   
    If lStatus = MMSYSERR_NOERROR Then
       
        pMxLine.cbStruct = LenB(pMxLine)
       
        'Цикл обхода линий назначения (DESTINATION)
        For lLineId = 0 To lLineCount - 1
           
            pMxLine.dwDestination = lLineId
           
            If m_OutputType = Hierarchy Then Call PrintInfo(1, "LINE OF DESTINATION")
           
            lStatus = mixerGetLineInfo(m_hMixer, VarPtr(pMxLine), MIXER_GETLINEINFOF_DESTINATION)
            If lStatus = MMSYSERR_NOERROR Then
                'Вывод наименования линии и вызов процедуры перечисления всех её контролов
                If m_OutputType = Hierarchy Then Call PrintInfo(2, "Line - " & GetBSTR(pMxLine.szName))
                Call EnumControls(pMxLine.dwLineID, pMxLine.cControls)
           
           
                If m_OutputType = Hierarchy Then Call PrintInfo(2, "LINE OF SOURCE")
                    'Цикл обхода линий источников (SOURCE)
                    For lConnect = 0 To pMxLine.cConnections - 1
                        pMxLine.dwSource = lConnect
                        lStatus = mixerGetLineInfo(m_hMixer, VarPtr(pMxLine), MIXER_GETLINEINFOF_SOURCE)
                        If lStatus = MMSYSERR_NOERROR Then
                            'Вывод наименования линии и вызов процедуры перечисления всех её контролов
                            If m_OutputType = Hierarchy Then Call PrintInfo(2, "Line - " & GetBSTR(pMxLine.szName))
                            Call EnumControls(pMxLine.dwLineID, pMxLine.cControls)
                        End If
                    Next
                If m_OutputType = Hierarchy Then Call PrintInfo(2, vbNullString)
               
            End If
           
        Next
       
        lStatus = mixerClose(m_hMixer)
       
    End If
           
End Sub


'[EnumControls]
'========================================================================================================
'ПРОЦЕДУРА ПЕРЕЧИСЛЕНИЯ КОНТРОЛОВ
'========================================================================================================
Private Sub EnumControls(ByVal lLineId As Long, ByVal lCtrlCount As Long)
    '#[in]lLineId                                   'Идентификатор линии
    '#[in]lCtrlCount                                'Количество контролов
    Dim lStatus             As Long                 'Статус вызова WinAPI функций
    Dim lCtrlId             As Long                 'Идентификатор контрола
    Dim cbMxCtrl            As Long                 'Размер структуры MIXERCONTROL в байтах
    Dim pMxCtrl()           As MIXERCONTROL         'Массив структур MIXERCONTROL
    Dim pMxLnCtrls          As MIXERLINECONTROLS
   
    '
    ' В этой процедуре перечисляются все контролы одной линии и для каждого контрола
    ' вызывается обработчик в который передается ссылка на структуру MIXERCONTROL
    '
   
    If lCtrlCount < 1 Then Exit Sub
   
    'Инициализация массива структур MIXERCONTROL по количеству lCtrlCount
    ReDim pMxCtrl(lCtrlCount - 1):  cbMxCtrl = LenB(pMxCtrl(0))
    For lCtrlId = 0 To UBound(pMxCtrl)
        'Для каждого элемента заполняется поле указавающее размер структуры
        pMxCtrl(lCtrlId).cbStruct = cbMxCtrl
    Next
   
    'MIXERLINECONTROLS
    With pMxLnCtrls
        .cbStruct = LenB(pMxLnCtrls)                'Размер структуры MIXERLINECONTROLS
        .cbMxCtrl = cbMxCtrl                        'Размео одного элемента MIXERCONTROL
        .paMxCtrl = VarPtr(pMxCtrl(0))              'Указатель на MIXERCONTROL
        .dwLineID = lLineId                         'Идентификатор линии
        .cControls = lCtrlCount                     'Количество контролов
    End With
   
    lStatus = mixerGetLineControls(m_hMixer, VarPtr(pMxLnCtrls), MIXER_GETLINECONTROLSF_ALL)
    If lStatus = MMSYSERR_NOERROR Then
        'После получение массива контролов обходим его и для каждого контрола вызываем обработчик
        For lCtrlId = 0 To UBound(pMxCtrl)
            If m_OutputType = Hierarchy Then Call PrintInfo(3, "Control - " & GetBSTR(pMxCtrl(lCtrlId).szName))
            Call HandlerControls(pMxCtrl(lCtrlId))
        Next
    End If
   
End Sub


'[HandlerControls]
'========================================================================================================
'ПРОЦЕДУРА ОБРАБОТЧИК КОНТРОЛОВ МИКШЕРА
'========================================================================================================
Private Sub HandlerControls(ByRef pCtrl As MIXERCONTROL)
    If m_OutputType = List Then Call PrintInfo(0, GetBSTR(pCtrl.szName))
    ' Эта процедура вызывается для всех найденых контролов микшера в процессе перечисления
    ' Данные содержаться в структуре MIXERCONTROL
    ' Используя эти данные здесь можно реализовать логику идентификации нужных контролов
    ' После чего для отобранных контролов(контрола) можно вызвать mixerGetControlDetails
    ' для анализа состояния и mixerSetControlDetails для установки нового состояния
End Sub


'[GetBSTR]
'========================================================================================================
'ФУНКЦИЯ ВОЗВРАЩАЕТ СТРОКУ BSTR ПОЛУЧЕННУЮ ИЗ СТРОКОВОГО БУФЕРА ЗАВЕРШАЕМОГО НУЛЕМ
'========================================================================================================
Private Function GetBSTR(ByVal pszBuff As String) As String
    '#[in] pszBuff          'Ссылка на тектовый буфер с завершающим нулём
    '#[out]GetBSTR          'Обычная строка VB (BSTR)
    GetBSTR = Left$(pszBuff, InStr(1, pszBuff, vbNullChar) - 1)
End Function


'[PrintInfo]
'========================================================================================================
'ПРОЦЕДУРА ВЫВОДА ОТЛАДОЧНОЙ ИНФОРМАЦИИ О ПЕРИЧИСЛЯЕМЫХ ЭЛЕМЕНТАХ МИКШЕРА
'========================================================================================================
Private Sub PrintInfo(ByVal Level As Long, ByVal sTextOut As String)
    '#[in]Level             'Уровень в иерархии вывода
    '#[in]sTextOut          'Выводимая строка
    Debug.Print Space(Level * 4) & sTextOut
    '
    ' Вместо вывода отладочной информации можно реализовать вывод в лог
    ' или другие места по необходимости
    '
End Sub

Вызов
Код: Выделить всё
Sub Main()
   
    Call EnumDevice(Hierarchy)
'    Call EnumDevice(List)
   
End Sub

Сам проект:
MixerEnum.rar
(5.12 Кб) Скачиваний: 195
Бороться и искать, найти и перепрятать

Пред.След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 23

    TopList