ดังนั้นฉันจึงมีปัญหานี้ที่แจ็คแผงด้านหน้าที่ทำให้เสียงย้อนกลับ เป็นเช่นนี้ตลอดไป แต่ฉันจัดการสลับช่องได้เสมอไม่ว่าจะบน windows หรือ ubuntu (ผ่าน pulseaudio) โดยเพียงแค่ค้นหาไฟล์ปรับแต่งและแมปตำแหน่งของฉันด้วยวิธีนั้น ทำงาน
เมื่อเร็ว ๆ นี้ฉันติดตั้ง Pipewire เพื่อการสตรีมเสียงที่ง่ายดายด้วยความขัดแย้งและอื่น ๆ แต่ดูเหมือนว่าฉันจะไม่พบเงื่อนงำที่ชัดเจนว่าจะแมปช่องอย่างไร
ถ้าใครสามารถแสดงให้ฉันเห็นว่าไฟล์ปรับแต่งที่ถูกต้องอยู่ที่ไหนและบรรทัดใดควบคุมตำแหน่งช่องสัญญาณเสียง ฉันจะดีใจและขอบคุณมาก
แก้ไข: ฉันใช้ ubuntu 21.10, pipewire เป็นเวอร์ชัน 3.34
คอนเฟิร์ม pipewire ของฉันที่ etc/pipewire/pipewire.conf
# ไฟล์กำหนดค่า Daemon สำหรับ PipeWire รุ่น "0.3.32" #
#
# คัดลอกและแก้ไขไฟล์นี้ใน /etc/pipewire สำหรับการเปลี่ยนแปลงทั้งระบบ
# หรือใน ~/.config/pipewire สำหรับการเปลี่ยนแปลงในเครื่อง
บริบท คุณสมบัติ = {
## กำหนดค่าคุณสมบัติในระบบ
#library.name.system = support/libspa-support
#context.data-loop.library.name.system = support/libspa-support
#support.dbus = จริง
#link.max-buffers = 64
link.max-buffers = 16 # รุ่น <3 ไคลเอนต์ไม่สามารถจัดการมากกว่านี้
#mem.warn-mlock = เท็จ
#mem.allow-mlock = จริง
#mem.mlock-ทั้งหมด = เท็จ
#clock.power-of-two-quantum = จริง
#log.ระดับ = 2
audio.position = "FR,FL"
core.daemon = true # กำลังฟังการเชื่อมต่อซ็อกเก็ต
core.name = pipewire-0 # ชื่อคอร์และชื่อซ็อกเก็ต
## คุณสมบัติสำหรับการกำหนดค่า DSP
#default.clock.rate = 48000
#default.clock.quantum = 1024
#default.clock.min-quantum = 32
#default.clock.max-quantum = 8192
#default.video.width = 640
#default.video.height = 480
#default.video.rate.num = 25
#default.video.rate.denom = 1
#
# การแทนที่เหล่านี้จะใช้เมื่อทำงานใน vm เท่านั้น
vm.overrides = {
default.clock.min-quantum = 1024
}
}
Context.spa-libs = {
#<ชื่อโรงงาน regex> = <ชื่อห้องสมุด>
#
#ใช้ค้นหาชื่อโรงงานสปา. มันจับคู่ชื่อโรงงานสปา
# นิพจน์ทั่วไปสำหรับชื่อไลบรารีที่ควรมี
#โรงงานนั้น.
#
audio.convert.* = audioconvert/libspa-audioconvert
api.alsa.* = alsa/libspa-alsa
api.v4l2.* = v4l2/libspa-v4l2
api.libcamera.* = libcamera/libspa-libcamera
api.bluez5.* = bluez5/libspa-bluez5
api.vulkan.* = vulkan/libspa-vulkan
api.jack.* = แจ็ค/libspa-jack
support.* = รองรับ/libspa-support
#videotestsrc = videotestsrc/libspa-videotestsrc
#audiotestsrc = audiotestsrc/libspa-audiotestsrc
}
บริบทโมดูล = [
#{ ชื่อ = <ชื่อโมดูล>
# [ หาเรื่อง = { <คีย์> = <ค่า> ... } ]
# [ ค่าสถานะ = [ [ ifexists ] [ nofail ] ]
#}
#
# โหลดโมดูลด้วยพารามิเตอร์ที่กำหนด
# หากได้รับ ifexists โมดูลจะถูกละเว้นเมื่อไม่พบ
# หากกำหนด nofail ความล้มเหลวในการเริ่มต้นโมดูลจะถูกละเว้น
#
# ใช้ RTKit เพื่อเพิ่มลำดับความสำคัญของเธรดข้อมูล
{ ชื่อ = libpipewire-module-rtkit
หาเรื่อง = {
#nice.level = -11
#rt.prio = 88
#rt.time.soft = 2000000
#rt.time.hard = 2000000
}
ค่าสถานะ = [ ifexists nofail ]
}
# กำหนดลำดับความสำคัญของเธรดโดยไม่ต้องใช้ RTKit
#{ ชื่อ = libpipewire-module-rt
# หาเรื่อง = {
# nice.level = -11
# rt.prio = 88
# rt.time.soft = 2000000
# rt.time.hard = 2000000
# }
# ธง = [ ifexists nofail ]
#}
# โปรโตคอลการสื่อสารดั้งเดิม
{ ชื่อ = libpipewire-module-protocol-native }
# โมดูลโปรไฟล์ อนุญาตให้แอปพลิเคชันเข้าถึงตัวสร้างโปรไฟล์
#และข้อมูลประสิทธิภาพ มันมีอินเทอร์เฟซที่ใช้
# โดย pw-top และ pw-profiler
{ ชื่อ = libpipewire-module-profiler }
# อนุญาตให้แอปพลิเคชันสร้างวัตถุข้อมูลเมตา มันสร้าง
# โรงงานสำหรับวัตถุข้อมูลเมตา
{ ชื่อ = libpipewire-module-metadata }
# สร้างโรงงานสำหรับสร้างอุปกรณ์ที่ทำงานใน
# บริบทของเซิร์ฟเวอร์ PipeWire
{ ชื่อ = libpipewire-module-spa-device-factory }
# สร้างโรงงานสำหรับสร้างโหนดที่ทำงานใน
# บริบทของเซิร์ฟเวอร์ PipeWire
{ ชื่อ = libpipewire-module-spa-node-factory }
# อนุญาตให้สร้างโหนดที่ทำงานในบริบทของ
# ลูกค้า. ถูกใช้โดยลูกค้าทั้งหมดที่ต้องการให้บริการ
# ข้อมูลไปยัง PipeWire
{ ชื่อ = libpipewire-module-client-node }
# อนุญาตให้สร้างอุปกรณ์ที่ทำงานในบริบทของ
# ลูกค้า. ถูกใช้โดยผู้จัดการเซสชัน
{ ชื่อ = libpipewire-module-client-device }
# โมดูลพอร์ทัลตรวจสอบ PID ของกระบวนการพอร์ทัล
# และแท็กการเชื่อมต่อด้วย PID เดียวกันกับพอร์ทัล
#การเชื่อมต่อ
{ ชื่อ = libpipewire-module-portal
ค่าสถานะ = [ ifexists nofail ]
}
# โมดูลการเข้าถึงสามารถตรวจสอบและบล็อกการเข้าถึงได้
#ลูกค้าใหม่.
{ ชื่อ = การเข้าถึงโมดูล libpipewire
หาเรื่อง = {
# access.allowed เพื่อแสดงรายการเส้นทางที่อนุญาต
# แอพ
#access.allowed = [
# /usr/bin/pipewire-media-session
#]
# อาร์เรย์ของเส้นทางที่ถูกปฏิเสธ
#การเข้าถึงถูกปฏิเสธ = [ ]
# อาร์เรย์ของเส้นทางที่มีการจำกัดการเข้าถึง
#การเข้าถึงจำกัด = [ ]
# สิ่งที่ไม่อยู่ในรายการข้างต้นได้รับมอบหมายให้
# access.force อนุญาต
#access.force = แฟลตแพ็ก
}
}
# สร้างโรงงานสำหรับการรวมโหนดในอะแดปเตอร์ด้วย a
# ตัวแปลงและตัวขยายสัญญาณ
{ ชื่อ = libpipewire-module-adapter }
# สร้างโรงงานสำหรับสร้างลิงค์ระหว่างพอร์ต
{ ชื่อ = libpipewire-module-link-factory }
# จัดหาโรงงานเพื่อสร้างวัตถุตัวจัดการเซสชั่น
{ ชื่อ = libpipewire-module-session-manager }
]
บริบทวัตถุ = [
#{ โรงงาน = <ชื่อโรงงาน>
# [ หาเรื่อง = { <คีย์> = <ค่า> ... } ]
# [ ค่าสถานะ = [ [ nofail ] ]
#}
#
# สร้างวัตถุจากโรงงาน PipeWire ด้วยพารามิเตอร์ที่กำหนด
# หากกำหนด nofail ข้อผิดพลาดจะถูกละเว้น (และไม่มีการสร้างวัตถุ)
#
#{ โรงงาน = spa-node-factory args = { factory.name = videotestsrc node.name = videotestsrc Spa:Pod:Object:Param:Props:patternType = 1 } }
#{ โรงงาน = spa-device-factory args = { factory.name = api.jack.device foo=bar } flag = [ nofail ] }
#{ โรงงาน = spa-device-factory args = { factory.name = api.alsa.enum.udev } }
#{ โรงงาน = spa-node-factory args = { factory.name = api.alsa.seq.bridge node.name = Internal-MIDI-Bridge } }
#{ โรงงาน = อะแดปเตอร์ args = { โรงงานชื่อ = audiotestsrc node.name = การทดสอบของฉัน } }
#{ โรงงาน = spa-node-factory args = { factory.name = api.vulkan.compute.source node.name = my-compute-source } }
# ไดรเวอร์จำลองเริ่มต้น สิ่งนี้จัดการโหนดที่มีเครื่องหมาย "node.always-driver"
คุณสมบัติ # เมื่อไม่มีไดรเวอร์อื่นที่ใช้งานอยู่ ลูกค้า JACK ต้องการสิ่งนี้
{ โรงงาน = โรงงานสปาโหนด
หาเรื่อง = {
ชื่อโรงงาน = support.node.driver
node.name = Dummy-Driver
node.group = ไปป์ไลน์ดัมมี่
ลำดับความสำคัญไดรเวอร์ = 20,000
}
}
{ โรงงาน = โรงงานสปาโหนด
หาเรื่อง = {
ชื่อโรงงาน = support.node.driver
node.name = Freewheel-Driver
Priority.driver = 19000
node.group = pipewire.freewheel
node.freewheel = จริง
}
}
สิ่งนี้สร้างโหนดต้นทางใหม่ มันจะมีพอร์ตอินพุต
ที่คุณสามารถเชื่อมโยงเพื่อให้เสียงสำหรับแหล่งที่มานี้
{ โรงงาน = อะแดปเตอร์
หาเรื่อง = {
factory.name = support.null-audio-sink
node.name = "ไมค์ของฉัน"
node.description = "ไมโครโฟน"
media.class = "เสียง/แหล่งที่มา/เสมือน"
audio.position = "FR,FL"
}
}
สิ่งนี้สร้างอุปกรณ์ต้นทาง PCM เดียวสำหรับที่กำหนด
นอกจากนี้ เส้นทางอุปกรณ์ hw:0. คุณเปลี่ยนแหล่งที่มาเป็นซิงก์ได้
เพื่อทำอ่างในลักษณะเดียวกัน
{ โรงงาน = อะแดปเตอร์
หาเรื่อง = {
ชื่อโรงงาน = api.alsa.pcm.source
node.name = "อัลซาซอร์ส"
node.description = "แหล่ง PCM"
media.class = "เสียง/แหล่งที่มา"
api.alsa.path = "hw:0"
api.alsa.period-size = 1024
api.alsa.headroom = 0
api.alsa.disable-mmap = เท็จ
api.alsa.disable-batch = เท็จ
audio.format = "S16LE"
audio.rate = 48000
เสียง.ช่องสัญญาณ = 2
audio.position = "FR,FL"
}
}
]
บริบท.exec = [
#{ เส้นทาง = <ชื่อโปรแกรม> [ args = "<อาร์กิวเมนต์>" ] }
#
# รันโปรแกรมที่กำหนดด้วยอาร์กิวเมนต์
#
# คุณสามารถเลือกที่จะเริ่มต้นผู้จัดการเซสชันได้ที่นี่
# แต่เป็นการดีกว่าที่จะเริ่มต้นเป็นบริการ systemd
# เรียกใช้ตัวจัดการเซสชันด้วย -h สำหรับตัวเลือก
#
#{ เส้นทาง = "/usr/bin/pipewire-media-session" args = "" }
#
# คุณสามารถเลือกเริ่มเซิร์ฟเวอร์ pulseaudio ได้ที่นี่เช่นกัน
# แต่เป็นการดีกว่าที่จะเริ่มต้นเป็นบริการ systemd
# มันน่าสนใจที่จะเริ่มต้น daemon อื่นที่นี่เพื่อฟัง
# ในที่อยู่อื่นด้วยตัวเลือก -a (เช่น -a tcp:4713)
#
#{ เส้นทาง = "/usr/bin/pipewire" args = "-c pipewire-pulse.conf" }
]
ช่องแผนที่ = ขวา, ซ้าย