현재 재생중인 오디오 스트림의 pulseaudio 서버를 전환해야합니다.
Pulseaudio 서버가 IP 192.168.1.105로 설정되었습니다.
$>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
...
소스 측에서 VLC 미디어 플레이어가 노래를 재생하고 있습니다.
소스 측에 펄스 오디오가있는 새로운 터널 싱크를 만들었습니다.
pacmd load-module module-tunnel-sink server=192.168.1.105
pacmd set-default-sink 1
그러나 오디오를 재생하는 동안 서버를 즉시 변경할 수 없었습니다. 플레이어를 멈추고 다시 재생 한 후에 만 괜찮습니다.
출력 장치의 “gnome-volume-control”또는 “gnome-control-center sound”전환에서 즉시 적용됩니다.
사운드 파일을 재생하는 동안 명령 줄에서 즉시 출력 싱크 전환을 적용하려면 어떻게해야합니까?
답변
PulseAudio pacmd
는 싱크 입력으로 스트림을 재생하는 동안 기본 싱크를 전환 할 수 없습니다. 그러나 여전히 이것을 달성 할 수있는 방법이 있습니다.
명령 줄에서 기본 싱크 변경
먼저 전환하려는 싱크의 색인 번호를 결정해야합니다. 다음을 호출하여 수행 할 수 있습니다.
pacmd list-sinks
시스템에 따라 액세스 가능한 현재의 싱크 및 속성 목록이 다소 길어집니다.
>>> 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>
index
또는 name
여기에 주어진 우리는 명령 라인으로 싱크대를 adressing에 필요한 것입니다. 현재 기본 싱크에는 별표 (여기 0
) 가 표시되어 있습니다 .
명령 줄에서 기본 싱크를 전환하려면 다음과 같이 해당 라인을 편집하여 스트림 대상 장치 복원 을 비활성화 해야 /etc/pulse/default.pa
합니다.
load-module module-stream-restore restore_device=false
싱크로 기본 출력 싱크를 변경하려면 1
다음을 실행하십시오.
pacmd set-default-sink 1
소리 설정 메뉴를 열어 성공을 시각화 할 수 있습니다 .
스트림을 다른 싱크로 이동
지정된 싱크로 재생중인 활성 입력 스트림이있는 동안 기본 싱크를 변경해 도 아무런 영향이 없습니다 . 이 입력을 다른 싱크로 이동하여 수행해야합니다.
pacmd list-sink-inputs
입력 스트림의 인덱스를 알려줍니다
>>> 1 sink input(s) available.
index: 5
driver: <protocol-native.c>
이제 우리는 호출 하여 입력 스트림 5
을 싱크로 옮기고 싶다는 것을 알고 있습니다.1
pacmd move-sink-input 5 1
0
원한다면 다시 싱크대로 재생을 중단 할 필요없이 바로 수행됩니다.
재생 중 기본 싱크 변경
물론이 두 명령을 결합하여 재생 중에 기본 싱크를 즉시 전환 할 수 있습니다.
pacmd set-default-sink 1 & pacmd move-sink-input 5 1
이 방법의 단점은 음악 플레이어를 중지했다가 다시 시작할 때마다 입력 스트림 색인이 변경 된다는 것 입니다. 따라서 commmand 행을 사용하여 전환하기 전에 항상 현재 스트림 색인을 찾아야합니다.
답변
모든 싱크 입력을 자동으로 이동하는 간단한 스크립트를 작성했습니다.
용법: ./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
답변
#!/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
내 런타임 사본은 github에 있으며 마스터 채널의 자동 전환도 포함 합니다.kmix
답변
명령 줄에서 기본 싱크, 볼륨 및 음소거 상태를 변경할 수 있는 루비 스크립트가 있습니다 (처음에는 포크로 만들고 섹션을 다시 썼습니다) .
답변
몇 가지 다른 장소에서 물건을 모으고 페어링 된 블루투스 JAMBOX를 설정하기 위해이 스크립트를 생각해 냈습니다. MAC은 물론 다릅니다. Clementine 앱을 통해 JAMBOX 볼륨을 제어하므로 필자의 경우 130 % 볼륨이 가장 효과적입니다. rhythmbox.png와 함께 이것을 바꾸고 싶을 수도 있습니다 (컴퓨터에서 찾을 수있는 유일한 스피커 사진이었습니다). 오류 검사는 초보적이지만 상당히 안정적으로 작동합니다. ASUS 넷북에서 편의를 위해 이것을 데스크탑 런처에 넣었습니다.
#!/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
답변
순환 토글 싱크.
가용 싱크를 통해 전환 할 수있는 라인이 하나 더있는 Gaco 스크립트.
#!/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
답변
다음은 싱크대 사이를 전환하는 스크립트입니다.
http://marginalhacks.com/index.0.html#pulse-switch-out
아래 스크립트는 다음과 같습니다.
#!/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