JACK / Pulseaudio: вывод звука из источника JACK в наушники (как направить другой звук на разные звуковые карты)

Вторая попытка не вызывает ошибки, но это не так. не работает нормально, если вы пытаетесь проверить, содержит ли файл хотя бы одну строку.

Вывод команды wc -l "/disk1/environment.sh" состоит из количества строк в файле, пробела и имени файла. Если вы хотите использовать количество строк, вам нужно его извлечь. Вместо разделения вывода существует более простой способ: вместо передачи имени файла в командной строке перенаправить вывод wc из файла. Затем wc печатает только номер без имени файла.

if [[ $(wc -l <"/disk1/environment.sh") -ge 0 ]];then  
   echo "File has data"  
fi

Или, поскольку вы все равно используете синтаксис bash,

if (($(wc -l <"/disk1/environment.sh") >= 0)); then  
   echo "File has data"  
fi

Конечно, это всегда верно, поскольку количество строк всегда больше или равно 0. Но вы можете получить полезные результаты с другими числами.

В первой попытке вы используете оператор -ge . Это оператор над целыми числами. Вы получаете сообщение об ошибке, потому что левая часть не целое число, а что-то вроде 42 /disk1/environment.sh.

Во второй попытке вы используете оператор < в условном операторе. Это оператор сравнения строк (в лексическом порядке). Так получилось, что вывод wc -l /disk1/environment.sh всегда лексически упорядочен после 0 , так как он начинается с цифры, поэтому [[$ ( wc -l <"/ disk1 / environment.sh")> 0]] всегда верно. Исключение составляют случаи, когда /disk1/environment.sh не существует; в этом случае wc -l ничего не выводит на стандартный вывод (вместо этого записывает сообщение об ошибке в стандартную ошибку), и сравнение неверно.

Сравнение количества строк в файле с 0 не очень полезно. В современных системах wc -l подсчитывает количество символов новой строки. В текстовом файле количество символов новой строки равно 0, только если файл пуст. (Обычно wc -l возвращает 0, если файл не содержит символа новой строки; текстовый файл содержит новую строку в конце каждой строки, а количество новых строк в нетекстовых файлах редко полезная информация.) В условных выражениях есть оператор, проверяющий, пуст ли файл, вам не нужно вызывать wc .

if [[ ! -e /disk1/environment.sh ]]; then
  if [[ -L /disk1/environment.sh ]]; then
    echo "/disk1/environment.sh is a broken symbolic link"
  else
    echo "/disk1/environment.sh does not exist"
  fi
elif [[ ! -r /disk1/environment.sh ]]; then
  echo "/disk1/environment.sh exists but is not readable"
elif [[ ! -s /disk1/environment.sh ]]; then
  echo "/disk1/environment.sh is empty or is a special file (name pipe, etc.)"
else
  echo "/disk1/environment.sh is not empty"
fi
1
20.03.2017, 12:30
1 ответ

Исправлено!

Решение: с помощью модуля alsa_out .

Чтобы использовать их, вы запускаете JACK как обычно. Затем вы запускаете экземпляр alsa_in или alsa_out для каждого дополнительного устройства (и «направления»), которое вы хотите использовать. alsa_out создаст набор портов, представляющих возможности воспроизведения устройства, а alsa_in будет представлять возможности захвата / записи

Итак:

  1. arecord --list-devices , чтобы найти имя встроенной звуковой карты (hw: 0,0)
  2. alsa_out -d hw: 0,0 для создания портов alsa_out, которые теперь отображаются в разъеме
  3. Подключите метроном к порт alsa_out в разъеме JACK - теперь воспроизводит метроном через разъем для наушников и любой другой звук, который требуется от звуковой карты USB!

http://www.jackaudio.org/faq/multiple_devices.html

2
27.01.2020, 23:34

Теги

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