У меня есть два источника звука в системе - два плеера (два instance одной программы). Мне необходимо определить из какого есть звук, из какого нет.
За исходный код взят
#Persistent
audioMeter := VA_GetAudioMeter()
VA_IAudioMeterInformation_GetMeteringChannelCount(audioMeter, channelCount)
VarSetCapacity(peakValues, channelCount*4)
SetTimer, GetPeakValues, 100
return
GetPeakValues:
VA_IAudioMeterInformation_GetChannelsPeakValues(audioMeter, channelCount, &peakValues)
loop %channelCount%
ToolTip %v%
until v := NumGet(peakValues, A_Index*4-4, "float")
return
Аргумент A_Index*4-4 в строке может принимать значения 0,4,8,12 и т.д. для своей системы опытным путем выяснил, что аргумент равен 4.
v := NumGet(peakValues, A_Index*4-4, "float")
Поступаю следующим образом - измеряемый источник в нормальном состоянии, второй mute. Запускаю функцию, которая делает 5 замеров с интервалом в 150 мс и суммирует полученные значения, по результатам делаю вывод звук есть/нет.
Если выключить оба источника сразу, отрабатывает нормально
Если включить оба сразу, так же срабатывает адекватно.
НО если включить один, сделать mute (ползунком громкости или клавишей mute не важно) на второй.. все равно считываемое значение больше "нуля", т.е. получается будто сигнал есть. Если закрыть одну из программ, то отрабатывает правильно, реагирует на громкость. Дополнительно контролировал по графическому отображению уровней сигналов в микшере записывающих устройств Windows - Алгоритмически все работает правильно, mute одного из источников действительно оставляет уровень другого.
Уже пробовал разные варианты - увеличивал интервалы между считыванием уровня громкости (например если mute у плеера происходит не мгновенно, а постепенно), запускал внутри функции проверки, или делал несколько вызовов функции, не получается ни в том ни в другом случае.
Я не силен в программинге под Win, но складывается такое ощущение, что либо я считываю не тот участок памяти, либо после mute одного из них, уровень на самом деле не изменяется, остается в памяти от второго приложения. Либо это заморочки с тем, что это две копии одного приложения ( хотя работают независимо друг от друга, проверено).
Поэтому вопросов два - первый по этой проблеме, второй можно ли каким-то образом узнать уровень звукового сигнала, генерируемого определенным окном?
Если не получится решить так, придется делать обработчик через анализ графики программы типа VU Meter, что ооочень бы не хотелось делать.
soundTestMux(MuxNumber)
{
audioMeter := VA_GetAudioMeter()
VA_IAudioMeterInformation_GetMeteringChannelCount(audioMeter, channelCount)
VarSetCapacity(peakValues, channelCount*4)
VA_IAudioMeterInformation_GetChannelsPeakValues(audioMeter, channelCount, &peakValues)
if MuxNumber = 1
{
soundTestMuxVar:= false
soundLevel := 0
measureCount := 0
if !Mux2isMuted
muteMux2()
NumGet(peakValues, 4, "float")
while measureCount <5
{
v := NumGet(peakValues, 4, "float")
soundLevel := soundLevel + v
Sleep, 150
measureCount++
}
ToolTip, Mux 1 %soundLevel%
if (soundLevel > 0.000153)
{
if Mux2isMuted
muteMux2()
soundTestMuxVar := true
}
else
{
soundTestMuxVar := false
if Mux2isMuted
muteMux2()
}
Tooltip, RESULT MUX1 %soundTestMuxVar%
}
}