Ubah Input / Output PulseAudio dari Shell?

38

Saya memiliki satu set headphone nirkabel yang bagus yang saya gunakan dari waktu ke waktu, selain speaker dan mikrofon biasa.

Saya ingin menulis skrip untuk beralih antara satu sumber input dan output dan yang lain, pada dasarnya beralih antara headphone dan speaker saya + mikrofon.

Saya ingin mengubah antara ini:

...dan ini:

Apakah ada cara bagi saya untuk skrip transfer antara dua input dan output? Pada dasarnya saya mencari sesuatu seperti ini:

CURRENT_INPUT="$(get-current-input-name)"
CURRENT_OUTPUT="$(get-current-output-name)"

if [ "$CURRENT_INPUT" == "Vengeance 2000" ]; then
    set-current-input "HD Pro Webcam C920"
else 
    set-current-input "Vengeance 2000"
fi

if ["$CURRENT_OUTPUT" == "Vengeance 2000" ]; then
    set-current-output "Built-in Audio"
else
    set-current-output "Vengeance 2000"
fi

Apakah ada cara untuk skrip ini?

Naftuli Kay
sumber
3
Anda mungkin melihat man pactlopsi-opsi baris perintah PulseAudio.
Teresa e Junior
Di luar topik: aplikasi GUI apa itu pada tangkapan layar itu?
WhyNotHugo
Ini Pengaturan Sistem dasar.
Naftuli Kay

Jawaban:

53

Seperti yang ditunjukkan oleh @ Teresa-e-Junior pactladalah alat untuk digunakan:

Pertama-tama kita mungkin ingin mendapatkan ID sink PA kita. Di sistem saya inilah yang saya dapatkan:

$ pactl list short sinks
0       alsa_output.pci-0000_01_00.1.hdmi-surround      module-alsa-card.c      s16le 6ch 44100Hz  SUSPENDED
1       alsa_output.pci-0000_00_1b.0.analog-stereo      module-alsa-card.c      s16le 2ch 44100Hz  RUNNING

Sink 1 saat ini adalah wastafel default saya.
Tapi sekarang saya ingin semua streaming saya saat ini dan masa depan diputar melalui HDMI (yaitu wastafel 0).

Ada perintah untuk mengatur bak cuci default untuk PulseAudio, tetapi sepertinya tidak berpengaruh pada PC saya:

$ pacmd set-default-sink 0 #doesn't work on my PC :(

Alih-alih, aliran baru tampaknya terhubung ke wastafel yang alirannya paling baru dipindahkan.

Jadi mari kita beri tahu pactl untuk memindahkan semua stream yang sedang diputar ke sink 0. Pertama-tama kita harus mendaftar mereka:

$ pactl list short sink-inputs
290     1       176     protocol-native.c       float32le 2ch 44100Hz
295     1       195     protocol-native.c       float32le 2ch 44100Hz

Oke, kita punya dua aliran (ID 290 dan 295) yang keduanya terhubung ke wastafel 1.
Mari kita gerakkan mereka untuk tenggelam 0:

$ pactl move-sink-input 290 0
$ pactl move-sink-input 295 0

Jadi, seharusnya begitu. Sekarang kita hanya perlu membuat skrip yang berfungsi untuk kita:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: $0 <sinkId/sinkName>" >&2
    echo "Valid sinks:" >&2
    pactl list short sinks >&2
    exit 1
fi

newSink="$1"

pactl list short sink-inputs|while read stream; do
    streamId=$(echo $stream|cut '-d ' -f1)
    echo "moving stream $streamId"
    pactl move-sink-input "$streamId" "$newSink"
done

Anda bisa menyebutnya dengan ID wastafel atau nama wastafel sebagai parameter (mis. Salah satunya 0atau sejenisnya alsa_output.pci-0000_01_00.1.hdmi-surround).

Sekarang Anda dapat melampirkan skrip ini ke acara udev atau pintasan kunci.

mreithub
sumber
1
Keren terima kasih! Saya telah mengubah ini menjadi skrip Python yang membuatnya bagus dan mudah digunakan, tersedia di sini .
Naftuli Kay
1
Terkait: askubuntu.com/a/14083/6645
Naftuli Kay
1
@NaftuliTzviKay: skrip Anda tidak tersedia lagi. Jika Anda masih memilikinya, pertimbangkan untuk mengirim ke [GitHub Gist] (gist.github.com).
Denilson Sá Maia
Dan bagaimana jika 0 sink input(s) available.? Tapi flash player yang menyebalkan itu masih memutar audio? Dan saya melihat flash player di client(s) logged inbagianpacmd list
Zhigalin
1
$ pacmd set-default-sink INDEXmasih diperlukan untuk skrip saya jika tidak perintah keyboard untuk mengubah volume terus menggunakan sumber wastafel yang lama.
myol
9

Perintah berikut digunakan untuk memanipulasi server suara PulseAudio:

pacmd - Used to reconfigure a PulseAudio sound server during runtime.
pactl - Used to control a running PulseAudio sound server.

Berikut ini beberapa contoh bagaimana fungsinya.

pacmd list-sinks:: daftar nama atau nomor indeks kemungkinan tenggelam

pacmd set-default-sink [sinkname]:: set sink keluaran default

pacmd set-default-source [sourcename]:: mengatur input default

pacmd set-sink-volume [index] [volume]:: mengatur volume wastafel

pacmd set-source-volume index volume:: rentang kendali volume 0 - 65536 (semakin rendah angkanya semakin rendah)

Ini hanya beberapa yang saya tarik dari halaman wiki & man. Referensi ini untuk informasi lebih rinci. Atau Anda dapat melihat perintah --helpatau manhalaman.

Ada juga alat baris perintah yang sudah ada di luar sana yang melayani tujuan ini. Nama itu adalah ponymix . Ini adalah mixer baris perintah untuk PulseAudio. Tautan yang disediakan adalah ke proyek github. Ini dikembangkan oleh teman dan sesama Pengguna / Pengembang Arch Linux Tepercaya. Jika Anda tidak menjalankan Arch, Anda bisa mengkompilasinya dari sumber menggunakan makedan sudo make install.

$ ponymix --help
    usage: ponymix [options] <command>... 
Options:
 -h, --help              display this help and exit    
 -c, --card CARD         target card (index or name)
 -d, --device DEVICE     target device (index or name)
 -t, --devtype TYPE      device type
 -N, --notify            use libnotify to announce volume changes
     --source            alias to -t source
     --input             alais to -t source
     --sink              alias to -t sink
     --output            alias to -t sink
     --sink-input        alias to -t sink-input
     --source-output     alias to -t source-output
Device Commands:
  help                   display this message
  defaults               list default devices (default command)
  set-default            set default device by ID
  list                   list available devices
  list-short             list available devices (short form)
  list-cards             list available cards
  list-cards-short       list available cards (short form)
  get-volume             get volume for device
  set-volume VALUE       set volume for device
  get-balance            get balance for device
  set-balance VALUE      set balance for device
  adj-balance VALUE      increase or decrease balance for device
  increase VALUE         increase volume
  decrease VALUE         decrease volume
  mute                   mute device
  unmute                 unmute device
  toggle                 toggle mute
  is-muted               check if muted
Application Commands:
  move DEVICE            move target device to DEVICE
  kill DEVICE            kill target DEVICE
Card Commands:
  list-profiles          list available profiles for a card
  list-profiles-short    list available profiles for a card(short form)
  get-profile            get active profile for card
  set-profile PROFILE    set profile for a card
Cinelli
sumber
Hai terima kasih atas jawaban ini! Itu membantu saya satu ton dengan masalah yang berkaitan dengan ini .
KlaymenDK
5

Di laptop saya berjalan Fedora 20, HDMI output yang tidak terdaftar sebagai wastafel dalam profil default, tetapi sebagai yang berbeda profil itu sendiri.

Saya hanya punya 1 wastafel seperti ini, musik yang bagus diputar di speaker laptop saya:

$ pactl list short sinks
8   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

Jika saya jalankan pactl set-card-profile 0 output:hdmi-stereomaka musik yang bagus diputar melalui HDMI. Saya mendapat:

$ pactl list short sinks
14  alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

Untuk kembali ke default saya jalankan pactl set-card-profile 0 output:analog-stereo+input:analog-stereo. Either way default ada lagi jika saya reboot.

Daftar profil untuk kartu saya ada di suatu tempat di pactl list cardsoutput.

RubenCaro
sumber
Info ini sudah disediakan oleh jawaban yang diterima. Tolong jangan menyalin jawaban pengguna lain kecuali Anda memiliki sesuatu untuk ditambahkan. Ini hanya mengulangi jawaban yang lain dan tidak memberikan yang baru atau berguna!
slm
5
set-card-profiletidak disebutkan sebelumnya, dan itulah info terpenting tentang jawaban ini.
Spidey
0

Memperluas jawaban yang diterima oleh @cinelli, saya telah membuat skrip itu

  • matikan antara tepat dua sink / perangkat keluaran yang harus didefinisikan dalam skrip,
  • matikan stream DAN bak cuci default, jadi tombol media pada keyboard berfungsi dan
  • membiarkan modul pembatalan gema saya tidak tersentuh.

Ubah sesuai kebutuhan!

#!/bin/bash

# Small script to switch between two hardcoded sound output devices

# Set patterns for devices to be toggled. Have to match to second column
# in output of "pactl list short sinks".
# (Could also hardcode the full names, but this might be a little more robust)
TOGGLE1="Jabra_EVOLVE"
TOGGLE2="Generic_ThinkPad_Dock_USB"

# Discover which sink (output device) is active, and set up toggles
while read -r stream; do
  echo "$stream"
  if echo "$stream" | grep -q "RUNNING"; then
    currentSink=$(echo "$stream" | cut -f2)
  fi
  if echo "$stream" | grep -q "$TOGGLE1"; then
    toggle1Sink=$(echo "$stream" | cut -f2)
  fi
  if echo "$stream" | grep -q "$TOGGLE2"; then
    toggle2Sink=$(echo "$stream" | cut -f2)
  fi
done < <(pactl list short sinks)

# Set up where to switch to
if [ "$currentSink" = "$toggle1Sink" ]; then
  newSink=$toggle2Sink
else
  newSink=$toggle1Sink
fi

# Switch streams AND default sink
pactl list short sink-inputs|while read -r stream; do
    streamId=$(echo "$stream"|cut '-d ' -f1)
    # exclude echo cancellation module, but switch all other streams
    # You can, but don't have to remove if condition if no such module present
    if [ "$streamId" != "0" ]; then
      echo "moving stream $streamId"
      pactl move-sink-input "$streamId" "$newSink"
    fi;
    # Also switch default sink, so media control keys work correctly
    pactl set-default-sink "$newSink"
done
Thor
sumber