Pulseaudio sink'i oynatma sırasında “pacmd set-default-sink” ile nasıl değiştirebilirim?


55

Çalmakta olan bir ses akışının pulseaudio sunucusunu değiştirmem gerekiyor.

Pulseaudio sunucusu IP 192.168.1.105 ile ayarlandı

$>cat /etc/pulse/default.pa
...
load-module module-esound-protocol-tcp auth-anonymous=1
load-module module-native-protocol-tcp auth-anonymous=1
load-module module-zeroconf-publish
...

Kaynak tarafında VLC media player bir şarkı çalıyor.

Kaynak tarafında pulseaudio ile yeni bir tünel havuzu yarattım.

pacmd load-module module-tunnel-sink server=192.168.1.105
pacmd set-default-sink 1

Ancak ses çalarken sunucu hemen değiştirilemez. Sadece oynatıcıyı durdurup tekrar oynattıktan sonra sorun değil.

Çıkış cihazlarının "gnome-hacim-kontrol" veya "gnome-kontrol-merkezi ses" den derhal anahtarlama işlemi uygulanır.

Bir ses dosyasının oynatımı sırasında çıkış havuzunu hemen komut satırından değiştirmeyi nasıl uygulayabilirim?

Yanıtlar:


83

PulseAudio pacmd, lavabo girişine aktif olarak oynayan bir akış varken varsayılan lavaboları değiştiremez. Ancak buna hala ulaşmanın bir yolu var.

Varsayılan havuzu komut satırından değiştirme

Öncelikle değiştirmek istediğimiz lavaboların indeks sayısını belirlememiz gerekir. Bu arayarak yapılabilir:

pacmd list-sinks

Sistemimize bağlı olarak, bu, şu anda erişilebilir olan az ya da çok uzun lavabo ve özellik listesi verecektir:

 >>> 2 sink(s) available.
      * index: 0
            name: <alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1>
            driver: <module-alsa-card.c>
    :
    :
        index: 1
            name: <alsa_output.pci-0000_00_14.2.analog-stereo>
            driver: <module-alsa-card.c>

indexVeya nameburada verilen biz komut satırı ile lavabo hitap için ne ihtiyaç vardır. Mevcut varsayılan havuz bir yıldız işaretiyle (burada 0) işaretlenmiştir .

Komut satırından varsayılan lavabolar geçiş yapabilmek için biz gerekebilir akışı hedef aygıt geri devre dışı yılında corresponing hattını düzenleyerek /etc/pulse/default.paiçin:

load-module module-stream-restore restore_device=false

Varsayılan çıkış havuzunu değiştirecek şekilde değiştirmek için 1çalıştırırız.

pacmd set-default-sink 1

Ses Ayarları menüsü açılarak başarı görselleştirilebilir .

Akışı başka bir lavaboya taşıma

Belirli bir lavaboya oynayan aktif bir giriş akışımız varken varsayılan lavabonuzu değiştirmenin bir etkisi yoktur . Bu, bu girişi başka bir lavaboya taşıyarak yapılmalıdır.

pacmd list-sink-inputs

Giriş akışının dizinini bize söyleyecektir

>>> 1 sink input(s) available.
    index: 5
    driver: <protocol-native.c>

Artık giriş akışını çağırarak 5çökmek istediğimizi biliyoruz.1

pacmd move-sink-input 5 1

ya da 0istersen bataklığa geri dönelim . Bu, oynatmayı durdurmaya gerek kalmadan derhal yapılacaktır.

Oynarken varsayılan havuzu değiştirme

Elbette, oynatma sırasında varsayılan lavaboları hemen değiştirmek için bu iki komutu birleştirebiliriz.

pacmd set-default-sink 1 & pacmd move-sink-input 5 1

Bu yöntemin bir dezavantajı , müzik yayını durdurduğumuzda ve her başlattığımızda giriş akışı endeksinin değişmesidir . Bu yüzden komut satırını kullanmadan önce daima mevcut akım indeksini bulmalıyız.


Bir lavaboya endeksine göre VEYA ismine göre başvurabilirsiniz pactl list short sinks> 4 bluez_sink.FC_A8_9A_2C_EB_0B module-bluez5-device.c s16le 1ch 8000Hz IDLEşimdi sadece isme atıfta bulunabilirsinizpactl set-default-sink bluez_sink.FC_A8_9A_2C_EB_0B
Leif Liddy

@LeifLiddy: Notunuz için teşekkürler. Pulseaudio'nun daha yeni sürümlerinde, aslında üzerinde bir lavabonun ismine başvurabilirsiniz, set-default-sinkancak hala endeks numarasına ihtiyacınız olacak move-sink-input.
Takkat

Peki ya 0 sink input(s) available.? Ama bu boktan flash player hala ses mi oynuyor?
Zhigalin

Ve client(s) logged inbölümünde flash player görüyorumpacmd list
Zhigalin

@Zhigalin Flash sistemimde uzun süre önce öldü, bu yüzden şunu söyleyemem ... doğrudan ALSA ile oynayabilir.
Takkat

27

Tüm lavabo girişlerini otomatik olarak taşımak için basit bir senaryo yazdım.

Kullanımı: ./movesinks.sh <sink number>

#!/bin/bash 
echo "Setting default sink to: $1";
pacmd set-default-sink $1
pacmd list-sink-inputs | grep index | while read line
do
echo "Moving input: ";
echo $line | cut -f2 -d' ';
echo "to sink: $1";
pacmd move-sink-input `echo $line | cut -f2 -d' '` $1

done

1
Korku veren! Bunu kendi kullanımım için biraz daha genişlettim: Görev çubuğumda iki ses kartı arasında geçiş yapacak bir simge istedim. Geçerli lavabosu belirlemek için Ruby'de küçük bir komut dosyası yazdım ve değişikliği yapmak için bu kabuk komut dosyasını çağırın ( pastebin.com/xb3i2ejW ). Ondan sonra, her iki betiği de ~ / bin içine koydum ve ruby ​​betiğini çalıştırmak için bir KDE simgesi özelleştirdim. Bu daha zarif veya tamamen kabuk senaryosunda yapılabilir, ancak benim için çalışıyor.
Pathogen

2
Bunun için teşekkürler. İşte son (? - Sadece iki tane) kullanılmayan çıktıya geçiş yapan bir sürüm: pastebin.com/raw/sidH7QPb yani çıktıyı değiştirir, bir kısayol tuşu ile eşleştirmek için uygundur.
Julian

4

@Gaco betiğinin geliştirilmiş versiyonu

#!/usr/bin/env bash

case "${1:-}" in
  (""|list)
    pacmd list-sinks |
      grep -E 'index:|name:'
    ;;
  ([0-9]*)
    echo switching default
    pacmd set-default-sink $1 ||
      echo failed
    echo switching applications
    pacmd list-sink-inputs |
      awk '/index:/{print $2}' |
      xargs -r -I{} pacmd move-sink-input {} $1 ||
        echo failed
    ;;
  (*)
    echo "Usage: $0 [|list|<sink name to switch to>]"
    ;;
esac

çalışma zamanı kopyam github'da ve ayrıca için Ana kanalın otomatik olarak değiştirilmesini içeriyorkmix



2

Birkaç farklı yerden bir araya toparlanmıştım ve eşleştirildikten sonra bir bluetooth JAMBOX oluşturmak için bu senaryoyu buldum. MAC'iniz elbette farklı olacak. JAMBOX birimini Clementine uygulamasıyla kontrol ettiğimden,% 130 birim en iyi durumda çalışıyor. Bunu değiştirmek isteyebilirsiniz, rhythmbox.png ile birlikte (bilgisayarımda bulabildiğim tek konuşmacıydı.). Hata denetimi ilkel, ancak oldukça güvenilir bir şekilde çalışır. Bunu ASUS netbook'una kolaylık sağlamak için bir masaüstü başlatıcısına koydum.

#!/bin/bash
# setjambox connection setup
# Find the particulars of your environment with 'pactl list sinks'
# This script uses the sink name instead of the index number
# You also need libnotify-bin to run this script

# Enter the bluetooth MAC address of your device here
MAC=00:21:3C:9F:19:AD

# Make ready
# Convert device address per pulseaudio standards
DEV=$(echo $MAC|tr ':' '_')
TITLE="JAMBOX $MAC"
CONNECTED="Audio connection updated."
PROBLEM="Unable to update settings."
JBLOGO=/usr/share/icons/hicolor/48x48/apps/rhythmbox.png

# And go

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

pactl set-default-sink bluez_sink.$DEV
pactl set-card-profile bluez_card.$DEV a2dp
pactl set-sink-volume  bluez_sink.$DEV 130%

if [ $? -eq 0 ]
then
   notify-send -i $JBLOGO -t 3000 "$TITLE" "$CONNECTED" 
else
   notify-send -i gtk-dialog-warning -t 3000 "$TITLE" "$PROBLEM"
fi

Kullanmak için +1 pactl list short. Doğrudan kesme işleminden sonra aşağıdaki satırı basitleştirebilirsiniz: pactl list short sink-inputs | cut -f1 | while read streamIdbenim için çalışıyor.
bodo

1

Çember-TOGGLE SINKS.

Gaco betiği, mevcut lavabolar arasında dolaşmak için sadece bir satır daha var.

#!/bin/bash 

new_sink=$(pacmd list-sinks | grep index | tee /dev/stdout | grep -m1 -A1 "* index" | tail -1 | cut -c12-)

echo "Setting default sink to: $new_sink";
pacmd set-default-sink $new_sink
pacmd list-sink-inputs | grep index | while read line
do
echo "Moving input: ";
echo $line | cut -f2 -d' ';
echo "to sink: $new_sink";
pacmd move-sink-input `echo $line | cut -f2 -d' '` $new_sink

done

harika, basit ve ölçekleme!
Paul Bastian

1

Ve işte lavabolar arasında geçiş yapacak bir senaryo:

http://marginalhacks.com/index.0.html#pulse-switch-out

İşte aşağıdaki komut dosyası:

#!/usr/bin/ruby
# Filename: pulse-switch-out
# Author:   David Ljung Madison <DaveSource.com>
# See License:  http://MarginalHacks.com/License/
# Description:  Switch pulse audio output (sink) using pacmd

PACMD = %w(pacmd)

##################################################
# Usage
##################################################
def fatal(*msg)
    msg.each { |m| $stderr.puts "[#{$0.sub(/.*\//,'')}] ERROR: #{m}" }
    exit(-1);
end

def usage(*msg)
    msg.each { |m| $stderr.puts "ERROR: #{m}" }
    $stderr.puts <<-USAGE

Usage:  #{$0.sub(/.*\//,'')} [sink]
  Switch sound playback device for ALSA/pulseaudio

    [sink]   Specify sink number to use (see 'pacmd list-sinks')

    USAGE
    exit -1;
end

def parseArgs
    opt = Hash.new
    loop {
        if (arg=ARGV.shift)==nil then break
        elsif arg == '-h' then usage
        elsif arg == '-?' then usage
        #elsif arg == '-arg' then opt[:arg] = true
        elsif arg =~ /^(\d)$/ then opt[:sink] = arg.to_i
        else
            usage("Unknown arg [#{arg}]")
        end
    }

    opt
end

# Unfortunately you can't return or break from the yield without leaving
# the pipe open, maybe use some sort of ensure and figure out how to close?
def pipe(cmd)
        # This is leaving files open
    #IO.popen(cmd.join(' ')).each { |l|
    a = `#{cmd.join(' ')}`
    ret = $?
    a.split("\n").each { |l|
        yield l
    }
    $?
end

def getSinks(ins=false)
    cmd = PACMD.dup
    cmd.push(ins ? 'list-sink-inputs' : 'list-sinks')
    curr = nil
    sinks = Array.new
    pipe(cmd) { |l|
        next unless l=~/\s*(\*)?\s*index:\s+(\d+)/
        i = $2.to_i
        sinks.push(i)
        curr = i if $1
    }
    return sinks,curr
end

##################################################
# Main code
##################################################
def main
    opt = parseArgs

    sinks,curr = getSinks

    usage("No sinks found?") if sinks.empty?
    usage("Only one sink found") if sinks.size==1

    if opt[:sink]
        usage("Unknown sink [#{opt[:sink]}] (out of #{sinks.join(' ')})") unless sinks.index(opt[:sink])
    else
        # Find next sink after curr
        opt[:sink] = sinks[0]
        sinks.each { |s|
            next unless s>curr
            opt[:sink] = s
            break
        }
    end

    # Set default sink
## For some reason this doesn't change the behavior of new apps.
    puts "Set sink: #{opt[:sink]}"
    system("#{PACMD} set-default-sink #{opt[:sink]} > /dev/null")
    usage("Couldn't set default sink [#{opt[:sink]}]") unless $?==0

    # And move all sink-inputs to the new sink
    ins,ignore = getSinks(true)
    ins.each { |i|
        puts "Move playback #{i} to sink #{opt[:sink]}"
        system("#{PACMD} move-sink-input #{i} #{opt[:sink]} > /dev/null")
        usage("Couldn't move playback #{i} to sink [#{opt[:sink]}]") unless $?==0
    }
end
main

1
Ubuntu'ya Sormaya Hoş Geldiniz! Bu soruyu teorik olarak cevaplayabilse de , cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak tercih edilir.
21

Tamam, ne yazık ki bu, burada olduğunu hatırlamadığım sürece betiğin burada güncellenmediği anlamına gelir. Bir örnek olarak, ruby, dizeleri için her şeyi (backtick bölümünde) kullanma şeklini değiştirdi, bu yüzden yukarıdaki 53 satırını güncellemem gerekiyordu. Veya güncel olduğundan emin olmak için komut dosyasını indirin.
David Ljung Madison Stellar

1

Gaco'nun cevabına dayanarak, kişisel kullanımım için biraz yeniden yazdım. Belki birileri yararlı bulur. USB Hoparlörlerimi ve USB Oyun kulaklığımı değiştirmek için.

#!/bin/bash

# get list of sinks/cards (for settings CARD1/CARD2)
# pacmd list-sinks | awk '/name:/ {print $0};' | awk '{ print $2}' | sed 's/<//g; s/>//g'

CARD1="alsa_output.usb-C-Media_INC._C-Media_USB_Audio-00"
CARD2="alsa_output.usb-Kingston_HyperX_Virtual_Surround_Sound_00000000-00"

CURRENT_SINK=$(pacmd stat | awk -F": " '/^Default sink name: /{print $2}' | awk 'BEGIN{FS=OFS="."} NF--' | sed 's/alsa_output/alsa_output/g')


function setCard() {

  if [ "$CURRENT_SINK" == "$1" ]
   then
     echo "Already using this Sink"
     exit 1
  fi

  NEW_SINK=$(pacmd list-sinks | awk '/index:/ {print $1 $2 $3} /name:/ {print $0};' | grep -m1 -B1 $1 | grep index | awk '{print $1}' | cut -d ":" -f2)
  SINK=$(pacmd set-default-sink $NEW_SINK)
  INPUT=$(pacmd list-sink-inputs | grep index | awk '{print $2}')

  pacmd move-sink-input $INPUT $NEW_SINK
  echo "Moving input: $INPUT to sink: $NEW_SINK";
  echo "Setting default sink to: $NEW_SINK";

  notify-send --urgency=low "Audio Switching" "SINK: $NEW_SINK"
}

function toggleSinks() {
  if [ "$CURRENT_SINK" == "$CARD1" ]
    then
      setCard $CARD2
    else
      setCard $CARD1
    fi
}


function showHelp() {
  echo "------------------------------------"
  echo "AUDIO SINK SWITCHER"
  echo " "
  echo "$0 [options]"
  echo " "
  echo "options:"
  echo "-h  --help        What you are looking at.."
  echo "-g, --gaming      Sets Gaming headset as output device"
  echo "-s, --speakers    Sets Speakers as output device"
  echo "-t, --toggle      Toggles the different output devices"
  echo " "
  echo "------------------------------------"
}

# check args length
if [ $# -eq 0 ]
  then
    echo "Toggling output devices (Speakers/Headset)"
    toggleSinks
fi


# arg options
while test $# -gt 0; do
    case "$1" in

                -h|--help)
                        showHelp
                        exit 1
                        ;;

                -g|--gaming)
                        setCard $CARD2
                        exit 1
                        ;;

                -s|--speakers)
                        setCard $CARD1
                        exit 1
                        ;;

                -t|--toggle)
                        toggleSinks
                        echo "Toggling output devices (Speakers/Headset)"
                        exit 1
                        ;;
                 *)
                        showHelp
                        exit 1
                        ;;
    esac
done

0

Söylemeye değer bir seçenek daha olduğunu düşünüyorum ve freedesktop.org adresindeki PulseAudio hakkında SSS için resmi sayfada yer alıyor . Aşağıdaki başlık altında:

Tüm uygulamaları taşıyarak varsayılan ses kartını nasıl değiştiririm?

Bunu yapmak için aşağıdaki komut dosyasını sağlarlar:

#/bin/bash
# paswitch 2011-02-02 by Ng Oon-Ee <ngoonee@gmail.com>
# I can't remember where I found this script, can't locate the original author.
# Please inform me if you know, so that I can give proper attribution.
# CHANGES: Added auto-move all inputs to new default sound card.
# WAS: Pulse Audio Sound Card Switcher v1.0 2010-01-13
#   Switches between soundcards when run. All streams are moved to the new default sound-card.

# $totalsc: Number of sound cards available
totalsc=$(pacmd "list-sinks" | grep card: | wc -l) # total of sound cards: $totalsc
if [ $totalsc -le 1 ]; then # Check whether there are actually multiple cards available
  notify-send -u critical -t 5000 "Nothing to switch, system only has one sound card."
  exit
fi
# $scindex: The Pulseaudio index of the current default sound card
scindex=$(pacmd list-sinks | awk '$1 == "*" && $2 == "index:" {print $3}')
# $cards: A list of card Pulseaudio indexes
cards=$(pacmd list-sinks | sed 's|*||' | awk '$1 == "index:" {print $2}')
PICKNEXTCARD=1 # Is true when the previous card is default
count=0 # count of number of iterations
for CARD in $cards; do
  if [ $PICKNEXTCARD == 1 ]; then
# $nextsc: The pulseaudio index of the next sound card (to be switched to)
    nextsc=$CARD
    PICKNEXTCARD=0
# $nextind: The numerical index (1 to totalsc) of the next card
    nextind=$count
  fi
  if [ $CARD == $scindex ]; then # Choose the next card as default
    PICKNEXTCARD=1
  fi
  count=$((count+1))
done
pacmd "set-default-sink $nextsc" # switch default sound card to next

# $inputs: A list of currently playing inputs
inputs=$(pacmd list-sink-inputs | awk '$1 == "index:" {print $2}')
for INPUT in $inputs; do # Move all current inputs to the new default sound card
  pacmd move-sink-input $INPUT $nextsc
done
# $nextscdec: The device.description of the new default sound card
# NOTE: This is the most likely thing to break in future, the awk lines may need playing around with
nextscdesc=$(pacmd list-sinks | awk '$1 == "device.description" {print substr($0,5+length($1 $2))}' \
                         | sed 's|"||g' | awk -F"," 'NR==v1{print$0}' v1=$((nextind+1)))
notify-send "Default sound-card changed to $nextscdesc"
exit
# Below text was from original author and remains unaltered
# CC BY - creative commons
# Thanks God for help :) and guys lhunath, geirha, Tramp and others from irc #bash on freenode.net

0

@Mpapis'i çalıştırırken basit bir "toggle sink0 veya sink1" e uyarladım:

#!/bin/bash
SINK_INDEX1=0
SINK_INDEX2=1
ACTIVE_SINK=$(pacmd list-sinks | grep '* index:' | grep -o '[0-9]*')
if [ "$ACTIVE_SINK" = $SINK_INDEX1 ] ; then
    pacmd set-default-sink $SINK_INDEX2
    pacmd list-sink-inputs | awk '/index:/{print $2}' | xargs -r -I{} pacmd move-sink-input {} $SINK_INDEX2
else 
    pacmd set-default-sink $SINK_INDEX1
    pacmd list-sink-inputs | awk '/index:/{print $2}' | xargs -r -I{} pacmd move-sink-input {} $SINK_INDEX1
fi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.