Это демонстрация концепции с использованием только alsa, модуля обратной связи alsa и sox
для обнаружения тишины. Модуль loopback предоставляет вам устройство вывода, на которое вы можете воспроизводить звук, а затем записывать с него. Так, например, вы можете настроить mplayer
на использование шлейфа для вывода звука, а затем запустить sox
для записи из шлейфа, обнаружения тишины и вывода на исходное аппаратное устройство вывода.
Загрузите модуль с помощью
sudo modprobe snd-aloop
(Он был в моем списке доступных модулей ядра ). aplay -l
теперь будет отображать новую карту с 2 устройствами. Устройство 0 для воспроизведения, устройство 1 для записи. Существует 8 независимых каналов «подустройства», и проще всего использовать номер 0, так как часто его можно опустить. (Я нашел aplay
в пакете alsa-utils
).
$ aplay -l
...
card 1: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
Subdevices: 8/8
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
...
Subdevice #7: subdevice #7
card 1: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
Subdevices: 8/8
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
...
Subdevice #7: subdevice #7
Теперь вы можете использовать другую утилиту из пакета для создания непрерывного тонального сигнала на кольцевое устройство 0 (подустройство 0):
speaker-test -t sine -D hw:Loopback
или, например, скажите mplayer
, чтобы использовать устройство с опцией -ao alsa:device=hw=Loopback
Вы ничего не услышите, пока не запустите sox
для чтения другой стороны устройства и записи на реальное оборудование, предполагая, что это карта 0:
sox -q -t alsa hw:Loopback,1 -t alsa hw:0 silence 0 1 10.0 2%
(Я видел довольно много предупреждений sox WARN alsa :под -run). Если вы остановите проверку динамиков, после 10 секунд тишины команда sox
прекратится. Примечание,если вы отключите звук mplayer
, вы получите тишину, но это, кажется, не зависит от уровня данных (, который вы можете визуализировать, если удалите -q
изsox
). Вам нужно приостановить или уменьшить уровень звука mplayer
, чтобы обнаружить тишину. sox
также может привести к задержке звука на одну-две секунды. Вы должны иметь возможность настроить alsa так, чтобы устройство Loopback использовалось по умолчанию вместо вашей карты 0.
Более удовлетворительное решение состоит в том, чтобы позволить звуковым драйверам ядра обрабатывать -звук реального времени и использовать sox
только для обнаружения тишины, отбрасывая его вывод. Это кажется возможным, но только с alsa это также немного сложно и требует знаний, которых у меня нет, хотя вы можете найти примеры дублирования звука на два устройства, вашу оригинальную звуковую карту и виртуальное устройство, которое sox
тогда можно читать.
Возможно более простое решение с использованием pulseaudio для включения мониторинга с использованием pactl load-module module-combine-sink
, которое я, вероятно, рассмотрю.
Да, если ваша переменная не оптимизирована.
Например, используя ls
с символами отладки:
gdb ls
>>> break main
>>> run
>>> print argv
$1 = (char **) 0x7fffffffdd78
В данном случае argv
является указателем. Если вам нужен адрес переменной-указателя, отличной от -, или адрес указателя, используйте &
, как в C; gdb
даст вам адрес, как указано выше, или сообщит вам, если переменная не сохранена в памяти:
>>> printf &argc
Address requested for identifier "argc" which is in register $rdi
В x86 содержимое SP
подскажет вам, где находится стек:
>>> i r sp
sp 0x7fffffffdc98 0x7fffffffdc98