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

Wireshark "следует, потоковая функция" TCP показывает полезную нагрузку данных, которая течет в обоих направлениях на выбранном сокетном соединении. Таким образом, это подходит пакеты сокетным соединением, которое является комбинацией Host1_IP_address:port <-> Host2_IP_address:port.

Можно читать больше на веб-странице wireshark по http://www.wireshark.org/docs/wsug_html_chunked/ChAdvFollowTCPSection.html

7
07.03.2014, 00:42
2 ответа
[112389] Небольшой ответ, но я мог бы описать проблемы/возможности, которые я нашел.

Я не вижу способа написать скрипт оболочки для этого. Не существует (документированного) способа изменения для каждого тома приложения с помощью [112807]pactl[112808]/[112809]pacmd[112810]. Также я не вижу способа определить, когда новый клиент добавляется без многократного опроса, например:

Импульсный аудио может быть настроен на запись в журнал через [112811]syslog[112812], так что одна из возможностей - это сценарий, вызываемый через [112813]rsyslog[112814] (если он есть в дистрибутиве). Смотрите мой ответ [112815] здесь[112816], чтобы узнать, как это сделать. Это, конечно, зависит от регистрирующей информации о новых клиентах [112817]pulseaudio[112818].

  1. Это определенно выполнимо, программа [112819]pavucontrol[112820] является отличным примером такого рода вещей. Однако, в настоящее время, похоже, что нет CLI, чтобы сделать то же самое, поэтому, скорее всего, потребуется более прямой интерфейс к [112821]pulseaudio[112822] API.
  2. Update
  3. Глядя на [112823]@derobert's link[112824], модуль role duckking будет достаточно прост для включения, но он требует указания свойств [112825]media.role[112826]. В любом случае я не могу найти, что это такое! Скорее всего, они не определены для большого количества потоков (многие программы до сих пор думают, что они используют ALSA). Если есть какой-то способ перечислить их и, возможно, настроить их для назначения (возможно, основываясь на названии процесса), то это будет самым простым способом.
  4. Обновление 2
  5. media.role[112828] может быть установлено с помощью переменной окружения [112829]PULSE_PROP[112830]. Eg:
Это можно установить для различных приложений, редактируя файлы [112831].desktop[112832] и/или создавая обёрточные скрипты, но это не очень хороший способ.[112406].
1
27.01.2020, 20:19

В вашем Regexp вы должны знать, что \ NO. - это ссылка на обратную ссылку для узора в скобках () . Таким образом, Regexp должен быть S @ ^ (\ S * Access_Log). * $ @ \ 1 / dev / stdout /; @ '

Я могу предложить

sed '/access_log/s|/[^;]\+|/dev/stdout|'

HINT: намерен использовать / Внутри патерна вы можете свободно изменить /// для каждого символа, который вы хотите S ### , например

-121--27319-

Подсказки в комментариях @derobert и @ Graeme полезны, но формат вывода неудобна, поэтому я написал анализатор для преобразования его на 0 0,0 , который проще разбираться. При этом я также добавил помощник, чтобы легко изменить громкость.

Можно встроить это в петлю и делать все, что вы хотите. Это в Ним Язык .

import osproc, strutils, pegs, os, parseopt2, sequtils

type Application = object
  id: int
  name: string
  volume: float

var verbose = false

proc tryExec(cmd): auto =
  if verbose: echo("executing $1" % [cmd])
  let output = execCmdEx(cmd)
  if output.exitCode != 0:
    raise newException(EBase, "Failed to execute `$1` with error code $2\nOutput:\n===\n$3\n===" %
                              [cmd, $output.exitCode, output.output])
  return output.output

iterator getPlayingApps(): auto =
  let paOutput = tryExec("pactl list sink-inputs")

  let sinkStrings = paOutput.split("\l\l")

  for str in sinkStrings:
    var num: int
    var volume: float
    var applicationName: string

    var matches = ["", ""]

    if str.find(peg"'Sink Input #'{\d+}", matches) != -1:
      num = parseInt(matches[0])
    else:
      raise newException(EBase, "Could not find sink input number in \n===\n$1" % [str])

    if str.find(peg"'Volume'@'/'\s*{\d+}'%'", matches) != -1:
      volume = parseFloat(matches[0])
    else:
      raise newException(EBase, "Could not find application volume in \n===\n$1" % [str])

    if str.find(peg"'application.name = ""'{[^""]+}'""'", matches) != -1:
      applicationName = matches[0]
    else:
      raise newException(EBase, "Could not find application name in \n===\n$1" % [str])

    yield Application(id: num, name: applicationName, volume: volume)

proc adjustAppVolume(app: Application, percent: float) =
  let nextVol = min((app.volume + (app.volume * (percent - 100) / 100.0)).int, 100)
  discard tryExec("pactl set-sink-input-volume $1 $2%" % [$app.id, $nextVol])

proc adjustName(name: string, percent: float) =
  for app in getPlayingApps():
    if app.name.contains(peg(name)):
      adjustAppVolume(app, percent)

proc printInfo() =
  for app in getPlayingApps():
    echo("$1\t$2\t$3" % [$app.id, app.name, $app.volume])

var params: seq[string] = @[]
for kind, key, val in getopt():
  case kind
  of cmdArgument:
    params.add(key)
  of cmdLongOption, cmdShortOption:
    case key
    of "help", "h":
      echo "usage: parsepa [-h|--help] [-v|--verbose] [<name expression> percent (-a|--adjust)] [-p|--print]"
      quit(QuitSuccess)
    of "verbose", "v":
      verbose = true
    of "adjust", "a":
      adjustName(params[0], parseFloat(params[1]))
      quit(QuitSuccess)
    of "print", "p":
      printInfo()
      quit(QuitSuccess)
    else:
      echo "Invalid Argument"
      quit(QuitFailure)
  else:
    echo "Invalid Argument"
    quit(QuitFailure)

X64 Binary в этом весте, для ленивых: https://gist.github.com/flaviut/9feb9a75bd452e6ddd03

1
27.01.2020, 20:19

Теги

Похожие вопросы