Score:1

กำหนดขีดจำกัดสูงสุดสำหรับการเพิ่มระดับเสียงด้วย i3, pactl และ bash

ธง in

ฉันต้องการกำหนดค่า i3WM เพื่อตั้งค่าระดับเสียงสูงสุด (เช่น 150%) ดังนั้นฉันจะไม่เพิ่มระดับเสียงเป็นมูลค่ามหาศาลโดยไม่ตั้งใจ ฉันสร้างสคริปต์ทุบตีซึ่งการดำเนินการเชื่อมโยงกับปุ่ม volume_up องค์ประกอบทั้งหมดทำงานได้ดีแยกกัน แต่เมื่อฉันรวมทุกอย่างเข้าด้วยกัน มีบางอย่างผิดปกติ

รหัสสคริปต์ทุบตี:

#!/bin/bash
max_volume_pc=$1
current_volume_pc=$(รายการ pactl จม | grep '^[[:space:]]Volume:' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \( [0-9][0-9]*\)%.*,\1,')
ถ้า (($current_volume_pc < $max_volume_pc-10)) ; แล้ว
    pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3สถานะ
อื่น
    a=$(($max_volume_pc - $current_volume_pc))
    pactl set-sink-volume @DEFAULT_SINK@ +$a% && $refresh_i3status
ไฟ

ผูกในไฟล์กำหนดค่า i3:

bindsym XF86AudioRaiseVolume exec ~/.config/i3/custom_configs/volume_up.sh 150

อะไรที่ใช้ได้ดี:

  • การเพิ่มจำนวนเมื่อผูกเป็นเพียงคำสั่งเดียวสำหรับการเพิ่มระดับเสียงด้วย pactl (ไม่มีสคริปต์ทุบตีใด ๆ เพียงแค่เรียกใช้คำสั่ง pactl ในไฟล์กำหนดค่า i3 เช่นเดียวกับคำสั่งในคำสั่ง if ด้านบน)
  • ดำเนินการเฉพาะสคริปต์ทุบตีด้านบนจากเทอร์มินัล
  • ดำเนินการทุกอย่างพร้อมกัน แต่เมื่อ current_volume_pc ฮาร์ดโค้ดเป็นค่าบางอย่าง

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

ฉันยังพบ reddit ด้วยคำถามที่คล้ายกันที่นี่: https://www.reddit.com/r/i3wm/comments/dens5j/limiting_pulseaudio_max_volume/แต่ฉันไม่เข้าใจว่าเกิดอะไรขึ้นในไฟล์ของ dikduk และฉันคิดว่าเป็นการดีกว่าสำหรับฉันที่จะขอความช่วยเหลือในการแก้ไขปัญหาของตัวเอง แทนที่จะคัดลอกวิธีแก้ปัญหาของคนอื่นมาวาง

Score:1
ธง in

ฉันพบปัญหา มันเกิดจากภาษาของระบบของฉัน - ฉันมาจากโปแลนด์ ดังนั้นฉันจึงตั้งค่าภาษาโปแลนด์เป็นภาษาของระบบ แต่ฉันเปลี่ยนภาษาเทอร์มินัลใน .bashrc เป็นภาษาอังกฤษเพราะสะดวกกว่า

ในกรณีของฉัน เมื่อฉันเรียกใช้สคริปต์ทุบตีโดยตรงจากเทอร์มินัล ฉันได้รับผลลัพธ์จาก รายการ pactl จม เป็นภาษาอังกฤษ (ฉันคิดว่าเนื่องจากการเปลี่ยนแปลงภาษา .bashrc) ดังนั้นทุกอย่างจึงทำงานได้ดี แต่เมื่อฉันเรียกใช้สคริปต์โดยใช้การเชื่อมโยงคีย์ ผลลัพธ์ที่ฉันได้รับจากคำสั่งด้านบนคือภาษาโปแลนด์ ดังนั้น grep จึงไม่พบคำว่า 'Volume' ฉันกำลังวางสคริปต์ทุบตีที่ถูกต้องซึ่งใช้งานได้ทั้งเมื่อโทรจากเทอร์มินัลหรือการเชื่อมโยงคีย์ด้านล่าง ถ้าใครมีปัญหาที่คล้ายกัน

#!/bin/bash
max_volume_pc=$1
current_volume_pc=$(รายการ pactl จม | grep '<คำภาษาระบบของคุณที่หมายถึง "volume">' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \ ([0-9][0-9]*\)%.*,\1,')

ถ้า (($(echo -n $current_volume_pc | wc -m) == 0)); แล้ว
    current_volume_pc=$(รายการ pactl จม | grep '^[[:space:]]Volume:' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \( [0-9][0-9]*\)%.*,\1,')
ไฟ

ถ้า (($current_volume_pc < $max_volume_pc-10)) ; แล้ว
    pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3สถานะ
อื่น
    a=$(($max_volume_pc - $current_volume_pc))
    pactl set-sink-volume @DEFAULT_SINK@ +$a% && $refresh_i3status
ไฟ
pa4080 avatar
cn flag
คุณสามารถตั้งค่าภาษาโดยเพิ่ม [`export LC_ALL=C`](https://unix.stackexchange.com/q/87745/201297) ที่จุดเริ่มต้นของสคริปต์ (หลังจาก shebang *#!/bin/bash *) เพื่อให้เป็นภาษาอิสระ

โพสต์คำตอบ

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