Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.134.107] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Решил сделать приблуду -думал делов-то на 5 минут...а н нет, в Вин 7 всё сложно Нашел компонент от Торри:
http://www.torry.net/quicksearchd.php?Stri...olume&Title=Yes TAudioVolume v.0.9.3 Демка от него работает, но компонент установить не получается. Может кто устанавливал-подскажите как и чего там. Если что меня интересует общая громкость в Вин7, но и поддержка ХР приветствуется. |
Сообщ.
#2
,
|
|
|
Для ХР(с учётом заявленной поддержки интерфейсов ХР в win7, должно бы работать и в win7):
Скрытый текст unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,mmsystem, StdCtrls, ComCtrls, ExtCtrls; type TForm1 = class(TForm) VolTrackBar: TTrackBar; MixerComboBox: TComboBox; procedure FormCreate(Sender: TObject); procedure MixerComboBoxSelect(Sender: TObject); procedure VolTrackBarChange(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1 :TForm1; hmx :HMIXER; mxcaps :tmixercaps; mxline :mixerline; mxlineControls :mixerlinecontrols; SPKLineID :DWORD; SPKVolumeControlID :DWORD; SPKChannels :Cardinal; c :array of mixercontrol; mxcdetail :TMIXERCONTROLDETAILS; volume :array[0..7] of integer; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin if mixergetnumdevs>0 then begin for i:=0 to mixergetnumdevs-1 do begin mixerGetDevCaps(i,@mxcaps,sizeof(tmixercaps)); Mixercombobox.Items.Add(mxcaps.szPname); end; Mixercombobox.itemindex:=0; MixerComboBoxSelect(self); end; end; procedure TForm1.MixerComboBoxSelect(Sender: TObject); var i,j,err:integer; DevIndex:integer; begin voltrackbar.Enabled:=false; DevIndex:=Mixercombobox.itemindex; mixerGetDevCaps(DevIndex,@mxcaps,sizeof(tmixercaps)); if mxcaps.cDestinations>0 then for i:=0 to mxcaps.cDestinations-1 do begin mxline.cbStruct:=sizeof(tmixerline); mxline.dwSource:=0; mixerGetLineInfo(DevIndex,@mxline, MIXER_GETLINEINFOF_DESTINATION or MIXER_OBJECTF_MIXER); if mxline.dwComponentType= MIXERLINE_COMPONENTTYPE_DST_SPEAKERS then if mxline.cControls>0 then begin MxLineControls.cbStruct:=sizeof(mixerlinecontrols); SPKLineID:=mxline.dwLineID; SPKChannels:=mxline.cChannels; MxLineControls.dwLineID:=mxline.dwLineID; MxLineControls.cControls:=mxline.cControls; MxLineControls.cbmxctrl:=sizeof(mixercontrol); setlength(c,MxLineControls.cControls); MxLineControls.pamxctrl:=@c[0]; mixerGetLineControls(DevIndex, @MxLineControls,MIXER_GETLINECONTROLSF_ALL or MIXER_OBJECTF_MIXER); for j:=0 to length©-1 do if c[j].dwControlType=MIXERCONTROL_CONTROLTYPE_VOLUME then begin voltrackbar.Min:= c[j].Bounds.lMinimum; voltrackbar.Max:= c[j].Bounds.lMaximum; SPKVolumeControlID:=c[j].dwControlID; voltrackbar.Enabled:=true; end; end; end; end; procedure TForm1.VolTrackBarChange(Sender: TObject); var i:integer; begin mxcdetail.cbStruct:=sizeof(TMIXERCONTROLDETAILS); mxcdetail.dwControlID:=SPKVolumeControlID; mxcdetail.cChannels:=SPKChannels; mxcdetail.hwndOwner:=0; mxcdetail.cMultipleItems:=0; mxcdetail.cbDetails:=sizeof(MIXERCONTROLDETAILS_UNSIGNED)*SPKChannels; for i:=o to SPKChannels-1 do volume[i]:=voltrackbar.Position; mxcdetail.paDetails:=@volume; mixerSetControlDetails(Mixercombobox.itemindex,@mxcdetail, MIXER_OBJECTF_MIXER or MIXER_SETCONTROLDETAILSF_VALUE); end; end. Для регулировки уровня сигнала с линии микшера "выход"/"waveout" можно воспльзоваться функцией waveoutsetvolume. Это проще, чем добираться к нужному контролу микшера "вручную". Но к master_volume(общая громкость/громкость динамиков) доступ возможен только через функции микшера, т.е., так, как в примере. В ХР. |
Сообщ.
#3
,
|
|
|
for j:=0 to length©-1 do
ругается на копирайт Добавлено Исправил тут: voltrackbar.Enabled:=true; l:=VolTrackBar.LineSize-1; for j:=0 To l do if c[j].dwControlType=MIXERCONTROL_CONTROLTYPE_VOLUME then begin voltrackbar.Min:= c[j].Bounds.lMinimum; voltrackbar.Max:= c[j].Bounds.lMaximum; SPKVolumeControlID:=c[j].dwControlID; voltrackbar.Enabled:=true; end; и тут: for i:=0 to SPKChannels-1 do volume[i]:=voltrackbar.Position; mxcdetail.paDetails:=@volume; mixerSetControlDetails(Mixercombobox.itemindex,@mxcdetail, MIXER_OBJECTF_MIXER or MIXER_SETCONTROLDETAILSF_VALUE); end; Ползунок ожил, так как вынес его из цикла-но эффекта не дало. В идеале тут библиотечку всё-таки поставить. Так это не просто крутилка громкости. У меня на микроконтролере своя прога которая управляющий сигнал шлет на ПК-а на ПК делфийская приблуда расспознает сигналы и уже должна рулить громкостью. Но чет гемор под семку это. |
Сообщ.
#4
,
|
|
|
Цитата ругается на копирайт Я текст поначалу в тег паскалевкий завернул, проверил, какая-то ерунда получается, часть строк невидимые(белый текст на белом фоне) оказываются. Length(c) Цитата Исправил тут: Ничего не понял, чего исправил. Всесто нуля буква o? Ну это могло быть, не дотянулся до нуля. Цитата l:=VolTrackBar.LineSize-1; for j:=0 To l do Это должен быть цикл, перебирающий контролы выбранной линии микшера. Он находит контрол, управляющий громкостью, запоминает его ID и настривает диапазон трекбара в соответствии с диапазоном контрола. for j:=0 to length(с)-1 do if c[j].dwControlType=MIXERCONTROL_CONTROLTYPE_VOLUME then begin voltrackbar.Min:= c[j].Bounds.lMinimum; voltrackbar.Max:= c[j].Bounds.lMaximum; SPKVolumeControlID:=c[j].dwControlID; voltrackbar.Enabled:=true; end; Цитата Ползунок ожил, так как вынес его из цикла-но эффекта не дало. Из какого цикла? |
Сообщ.
#5
,
|
|
|
Вот из этого же цикла:
for j:=0 to length(с)-1 do if c[j].dwControlType=MIXERCONTROL_CONTROLTYPE_VOLUME then begin voltrackbar.Min:= c[j].Bounds.lMinimum; voltrackbar.Max:= c[j].Bounds.lMaximum; SPKVolumeControlID:=c[j].dwControlID; voltrackbar.Enabled:=true; end; Попрежнему ругаеться на for j:=0 to length(с)-1 do Ну и вообще строка Длина Массива - фиг бы на минус один. Длина контейнера, внутри которого есть контейнеры со своей длиной. Я конечно не супер прогер, но что-то тут не то Ну и: var i,j,err:integer; DevIndex:integer; Так лучше: var i,j,err,DevIndex:integer; Откуда код взяли? Или киньте проектом, если говорите что парсер код поел... |
Сообщ.
#6
,
|
|
|
Цитата Вот из этого же цикла: Всё-таки внесите его обратно и разберитесь с кодом. Если нужно, подскажу, что знаю. Цитата Ну и вообще строка Длина Массива - фиг бы на минус один. Длина контейнера, внутри которого есть контейнеры со своей длиной. Я конечно не супер прогер, но что-то тут не то А я с тудом разбираю смысл написанного. Length(переменная массива) - что не так? Длина контейнера,внутри которого есть контейнеры со своей длиной, опредлеяемой размером mixercontrol. Всё тут то. Цитата Так лучше да это вообще на любителя и на скорость ветра никак не влияет. Цитата Откуда код взяли? Взял и написал. Когда-то. |
Сообщ.
#7
,
|
|
|
хорошо, я вернул всё назад.
У меня громкость не регулируется. В VolTrackBar Max поставил 1000 Min:=0. Насколько я понимаю цикл: for j:=0 to length(с)-1 do if c[j].dwControlType=MIXERCONTROL_CONTROLTYPE_VOLUME then begin voltrackbar.Min:= c[j].Bounds.lMinimum; voltrackbar.Max:= c[j].Bounds.lMaximum; SPKVolumeControlID:=c[j].dwControlID; voltrackbar.Enabled:=true; end; Ни разу не выполняется, поэтому voltrackbar.Enabled:=true; не происходит, поэтому и не регулируется(оно не ползает, не крутится). Надеюсь понятно выражаюсь Возможно под ХР и работает этот код, но я сейчас на Вин 7 компилю и тестирую. |
Сообщ.
#8
,
|
|
|
Выполняется ли цикл, можно проверить в отладчике. Ставьте брекпоинт в цикле, сразу увидите. Имхо, он у вас выполняется, но контрол с типом MIXERCONTROL_CONTROLTYPE_VOLUME не обнаруживается. Отчего это может быть, нужно проверять в том же отладчике. В качестве предположения, вы выбираете микшер записи в комбобоксе, вместо микшера воспроизведения. Или же 7-ка даёт о себе знать. Сначала удостоверьтесь в том, что микшер выбран правильный, а дальше только по шагам смотреть, что возвращают функции микшера в переменных
mxcaps :tmixercaps; mxline :mixerline; mxlineControls :mixerlinecontrols; c :array of mixercontrol; mxcdetail :TMIXERCONTROLDETAILS; Проверил на звуковых картах креатив и реалтек, на хр. Отрабатывает как положено. |
Сообщ.
#9
,
|
|
|
Да вот там у меня только Реалтек. но судя по тому компоненту о котором я говорил раннее для Семерки должно быть Динамики (Реалтек ХД), а их нету-поэтому и не работает. Жалко-с семкой не совместимо
|
Сообщ.
#10
,
|
|
|
Вот скрин из библиотеки Торри-выбран второй вариант. первый для ХР.
Прикреплённый файлExample.jpg (32,76 Кбайт, скачиваний: 470) А в вашей проге только один вариант: Realtek High Definition Audio Если честно незнаю в чем там отличия дикие...но факт-не работает так. |
Сообщ.
#11
,
|
|
|
Снова не понял. У вас в 7-ке на вашей карте отсутсвует регулировка громкости?
|
Сообщ.
#12
,
|
|
|
ХЗ. В Микшере громкости в Семерке у меня выбрано устройство-Динамики, а не Риалтек. Поэтому ваша программа не регулирует ничего. Если бы в ней определялись Динамики-то тогда все ок, было бы.
|
Сообщ.
#13
,
|
|
|
Если не боитесь, запускайте. Если не работает, тогда желательно вывести все типы линий и контролов(например, в мемо) и посмотреть, что там вообще драйвер возвращает.
Прикреплённый файлProject1.rar (163,81 Кбайт, скачиваний: 155) Добавлено Цитата Boold0zer @ ХЗ. В Микшере громкости в Семерке у меня выбрано устройство-Динамики, а не Риалтек. Поэтому ваша программа не регулирует ничего. Если бы в ней определялись Динамики-то тогда все ок, было бы. 7-ка обращается к звуковушке через свои собственные интерфейсы, и обзывает устройства и линии микшера как хочет [производитель драйверов под 7-ку]. Концепция звуковых устройств 7-ки совершенно иная нежели в xp( уже писал об этом в других темах). Что там и как нащывается на вкладках настроек в 7-ке, не суть важно. Важно, чтобы старые интерфейсы поддерживались драйвером корректно. Что бывает далеко не всегда, но бывает. |
Сообщ.
#14
,
|
|
|
шляпа. Динамики в списке есть, это единственный пункт меню который разблокирует voltrackbar, на остальные не реагирует.
а ну да-громкость по прежнему не регулируется, даже с правами админа. чего бояться вокруг одни виртуалки, песочницы внутри... видимо не поддерживается на данном конфиге (всмысле драйвер виноват, а не конфиг). >>Если не работает, тогда желательно вывести все типы линий и контролов(например, в мемо) и посмотреть, что там вообще драйвер возвращает. Это как, Вы скинули только ехе. Где код поправить? |
Сообщ.
#15
,
|
|
|
Цитата Динамики в списке есть, это единственный пункт меню который разблокирует voltrackbar, на остальные не реагирует. Я правильно понял, вы запускаете проект и в комбобоксе появляется несколько пунктов: динамики и что-то ещё? При выборе динамиков разблоктруется трекбар, но громкость не регулируется? Цитата вокруг одни виртуалки Что тоже может являться причиной глюков. |