Score:0

ช่องสัญญาณเสียงของหูฟังกลับด้าน ฉันจะเปลี่ยนตำแหน่งช่องบน Pipewire ได้อย่างไร

ธง jp

ดังนั้นฉันจึงมีปัญหานี้ที่แจ็คแผงด้านหน้าที่ทำให้เสียงย้อนกลับ เป็นเช่นนี้ตลอดไป แต่ฉันจัดการสลับช่องได้เสมอไม่ว่าจะบน 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" }
]

ช่องแผนที่ = ขวา, ซ้าย

Someone avatar
my flag
คุณไม่ได้ให้รายละเอียดของระบบปฏิบัติการและรุ่น คุณใช้ Ubuntu เวอร์ชันใด ตามที่เขียนไว้ในขณะนี้ เป็นการยากที่จะระบุคำตอบที่เพียงพอ โปรด [แก้ไข] คำถามและเพิ่มรายละเอียดให้เพียงพอ เพื่อให้เราสามารถระบุคำตอบที่เหมาะสมได้ ขอบคุณ.
Hayguneys avatar
jp flag
โอเค เพิ่มเวอร์ชันอูบุนตูที่ฉันใช้อยู่และเวอร์ชันไพพ์ไวร์ เพิ่ม .conf ทั้งหมดของฉันสำหรับไพพ์ไวร์ด้วย
Someone avatar
my flag
ขอบคุณสำหรับข้อมูล.
Score:1
ธง jp

ตกลง ดังนั้นฉันจึงติดตั้ง EasyEffects ซึ่งรวมปลั๊กอินที่ดีที่เรียกว่า Stereo Tool ไว้ด้วยกัน ฉันจึงพลิก FL กับช่อง FR โดยไม่ยุ่งยาก นับเป็นสวรรค์ที่แท้จริง! มันจัดการไปป์ไวร์โดยรวมจากสิ่งที่ฉันเข้าใจ ดังนั้นมันจึงเป็นเครื่องมือที่มีประสิทธิภาพที่ดีนี่คือลักษณะของปลั๊กอินใน EasyEffects

Score:0
ธง bv

ขอบคุณสำหรับคำถามและคำตอบ ฉันพบสิ่งนี้เพื่อค้นหาวิธีแก้ปัญหาที่คล้ายกัน อย่างไรก็ตาม EasyEffects ไม่ได้กำหนดเส้นทางไปยังอุปกรณ์ที่เหมาะสม และเมื่อฉันลองใช้งานมันด้วยความพยายามที่จะทำให้มันทำงานได้อย่างที่ฉันพอใจ ระบบเสียงก็ยังหยุดทำงาน

ฉันสิ้นสุดการทบทวน เอกสารประกอบของ PipeWire และเพียงแค่ปรับแต่งตัวอย่างเล็กน้อย และโซลูชันก็ใช้งานได้อย่างมีเสน่ห์

ทำตามขั้นตอน:

  1. ฉันคัดลอกผ่าน /usr/share/pipewire/pipewire.conf ไฟล์ไปที่ /etc/pipewire/pipewire.conf (จะเป็นทั้งระบบ สามารถ copy ไปไว้ที่ ~/.config/pipewire/pipewire.conf สำหรับการตั้งค่าผู้ใช้)

  2. จากนั้นฉันเพิ่มโมดูลต่อไปนี้:

    บริบทโมดูล = [
    ...
    ##### คัดลอกบรรทัดด้านล่างและเพิ่มใน /etc/pipewire/pipewire.conf ของคุณ
    #####
    { ชื่อ = libpipewire-module-loopback
            หาเรื่อง = {
                เสียง.ตำแหน่ง = [ FL FR ]
                การจับภาพ อุปกรณ์ประกอบฉาก = {
                    media.class = เสียง/ซิงก์
                    node.name = my_sink
                    node.description = "จมของฉัน"
                    #node.latency = 1024/48000
                    #audio.rate = 44100
                    #audio.channels = 2
                    #audio.position = [ ฟลอริด้า FR ]
                    #node.target = "my-default-sink"
                }
                Playing.props = {
                    #media.class = เสียง/แหล่งที่มา
                    node.name = my_sink
                    node.description = "จมของฉัน"
                    #node.latency = 1024/48000
                    #audio.rate = 44100
                    #audio.channels = 2
                    audio.position = [ FR FL ]
                    node.target = "my-default-sink"
                }
            }
        }
    
    

    นี่มาจากหัวข้อ 'สร้าง Sink/Source แบบรวม' ข้อแตกต่างเพียงอย่างเดียวจากตัวอย่างคือ เสียง.ตำแหน่ง สายของ การเล่นอุปกรณ์ประกอบฉาก ซึ่งฉันกลับ

  3. รีสตาร์ทท่อ:

    systemctl -- ผู้ใช้รีสตาร์ท pipewire pipewire-pulse pipewire-media-session.service
    
  4. การเลือก อ่างล้างจานของฉัน เนื่องจากอุปกรณ์เสียงเริ่มต้นในการตั้งค่า GNOME กลับช่องสัญญาณ และดูเหมือนว่าจะแพร่หลาย

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา