|
|
@ -37,9 +37,9 @@ AUDIO_DELTA=${AUDIO_DELTA:-3} |
|
|
|
# AUDIO_DELTA=${AUDIO_DELTA:-1} |
|
|
|
|
|
|
|
# LONG_FORMAT=${LONG_FORMAT:-'${SYMB} ${VOL}% [${INDEX}:${NAME}]'} |
|
|
|
LONG_FORMAT=${SHORT_FORMAT:-'${SINK_SYMB} ${VOL}%'} |
|
|
|
LONG_FORMAT=${SHORT_FORMAT:-'${SINK_SYMB} ${VOL}%'} |
|
|
|
# SHORT_FORMAT=${SHORT_FORMAT:-'${SYMB} ${VOL}%[${INDEX}]'} |
|
|
|
SHORT_FORMAT=${SHORT_FORMAT:-'${SINK_SYMB} ${VOL}%'} |
|
|
|
SHORT_FORMAT=${SHORT_FORMAT:-'${SINK_SYMB} ${VOL}%'} |
|
|
|
|
|
|
|
# flags {{{ # |
|
|
|
|
|
|
@ -92,14 +92,13 @@ done |
|
|
|
# functions {{{ # |
|
|
|
|
|
|
|
if [[ -z "$MIXER" ]] ; then |
|
|
|
# Use the default ALSA mixer |
|
|
|
MIXER="default" |
|
|
|
if amixer -D pulse info >/dev/null 2>&1 ; then |
|
|
|
MIXER="pulse" |
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
if [[ -z "$SCONTROL" ]] ; then |
|
|
|
SCONTROL=$(amixer -D "$MIXER" scontrols | sed -n "s/Simple mixer control '\([^']*\)',0/\1/p" | head -n1) |
|
|
|
# Use the 'Master' control |
|
|
|
SCONTROL="Master" |
|
|
|
fi |
|
|
|
|
|
|
|
CAPABILITY=$(amixer -D $MIXER get $SCONTROL | sed -n "s/ Capabilities:.*cvolume.*/Capture/p") |
|
|
@ -142,21 +141,18 @@ esac |
|
|
|
# print_format {{{ # |
|
|
|
|
|
|
|
function print_format { |
|
|
|
# echo $NAME |
|
|
|
case $NAME in |
|
|
|
# *"USB"*) |
|
|
|
*"Fiio"*) |
|
|
|
SINK_SYMB="" |
|
|
|
;; |
|
|
|
*"hdmi"*) |
|
|
|
SINK_SYMB="" |
|
|
|
;; |
|
|
|
*"pci"*) |
|
|
|
SINK_SYMB=" " |
|
|
|
;; |
|
|
|
esac |
|
|
|
# echo "$1" | envsubst '${SYMB}${VOL}${INDEX}${NAME}' |
|
|
|
echo "$1" | envsubst '${SINK_SYMB}${VOL}${INDEX}${NAME}' |
|
|
|
case $NAME in |
|
|
|
*"Fiio"*) |
|
|
|
SINK_SYMB="" |
|
|
|
;; |
|
|
|
*"hdmi"*) |
|
|
|
SINK_SYMB="" |
|
|
|
;; |
|
|
|
*"pci"*) |
|
|
|
SINK_SYMB=" " |
|
|
|
;; |
|
|
|
esac |
|
|
|
eval "echo \"$1\"" |
|
|
|
} |
|
|
|
|
|
|
|
# }}} print_format # |
|
|
@ -164,38 +160,25 @@ function print_format { |
|
|
|
# print_block {{{ # |
|
|
|
|
|
|
|
function print_block { |
|
|
|
for name in INDEX NAME VOL MUTED; do |
|
|
|
read $name |
|
|
|
done < <(pacmd list-sinks | grep "index:\|name:\|volume: front\|muted:" | grep -A3 '*') |
|
|
|
INDEX=$(echo "$INDEX" | grep -o '[0-9]\+') |
|
|
|
VOL=$(echo "$VOL" | grep -o "[0-9]*%" | head -1 ) |
|
|
|
# Use amixer to get volume and mute status |
|
|
|
VOL_INFO=$(amixer -D $MIXER get $SCONTROL | grep -m1 -oE '[0-9]+%|\[on\]|\[off\]') |
|
|
|
VOL=$(echo "$VOL_INFO" | grep -oE '[0-9]+%' | head -1) |
|
|
|
VOL="${VOL%?}" |
|
|
|
MUTED=$(echo "$VOL_INFO" | grep -oE '\[on\]|\[off\]') |
|
|
|
|
|
|
|
NAME=$(echo "$NAME") |
|
|
|
# NAME=$(echo "$NAME" | sed \ |
|
|
|
# 's/.*<.*\.\(.*\)>.*/\1/; t;'\ |
|
|
|
# 's/.*<\(.*\)>.*/\1/; t;'\ |
|
|
|
# 's/.*/unknown/') |
|
|
|
# NAME=$(echo "$NAME" | sed \ |
|
|
|
# 's/.*<.*\.\(.*\)\..*>.*/\1/; t;') |
|
|
|
# Default name for ALSA |
|
|
|
NAME=$(amixer -D $MIXER scontrols | sed -n "s/Simple mixer control '\([^']*\)',0/\1/p" | head -n1) |
|
|
|
|
|
|
|
if [[ $USE_ALSA_NAME == 1 ]] ; then |
|
|
|
ALSA_NAME=$(pacmd list-sinks |\ |
|
|
|
awk '/^\s*\*/{f=1}/^\s*index:/{f=0}f' |\ |
|
|
|
grep "alsa.name\|alsa.mixer_name" |\ |
|
|
|
head -n1 |\ |
|
|
|
sed 's/.*= "\(.*\)".*/\1/') |
|
|
|
ALSA_NAME=$(amixer -D $MIXER scontrols | sed -n "s/Simple mixer control '\([^']*\)',0/\1/p" | head -n1) |
|
|
|
NAME=${ALSA_NAME:-$NAME} |
|
|
|
elif [[ $USE_DESCRIPTION == 1 ]] ; then |
|
|
|
DESCRIPTION=$(pacmd list-sinks |\ |
|
|
|
awk '/^\s*\*/{f=1}/^\s*index:/{f=0}f' |\ |
|
|
|
grep "device.description" |\ |
|
|
|
head -n1 |\ |
|
|
|
sed 's/.*= "\(.*\)".*/\1/') |
|
|
|
DESCRIPTION=$(amixer -D $MIXER scontrols | sed -n "s/Simple mixer control '\([^']*\)',0/\1/p" | head -n1) |
|
|
|
NAME=${DESCRIPTION:-$NAME} |
|
|
|
fi |
|
|
|
|
|
|
|
if [[ $MUTED =~ "no" ]] ; then |
|
|
|
# Fix mute status check |
|
|
|
if [[ $MUTED == "[on]" ]] ; then |
|
|
|
SYMB=$AUDIO_HIGH_SYMBOL |
|
|
|
[[ $VOL -le $AUDIO_MED_THRESH ]] && SYMB=$AUDIO_MED_SYMBOL |
|
|
|
[[ $VOL -le $AUDIO_LOW_THRESH ]] && SYMB=$AUDIO_LOW_SYMBOL |
|
|
@ -222,3 +205,141 @@ if [[ $SUBSCRIBE == 1 ]] ; then |
|
|
|
print_block |
|
|
|
done < <(pactl subscribe | stdbuf -oL grep change) |
|
|
|
fi |
|
|
|
|
|
|
|
# Hardware Configuration |
|
|
|
#CARD=2 |
|
|
|
#SINK="alsa_output.pci-0000_30_00.6.analog-stereo" |
|
|
|
#FRONT="Front Playback Switch" |
|
|
|
#REAR="Surround Playback Switch" |
|
|
|
#FRONT_VOL="Front Playback Volume" |
|
|
|
#REAR_VOL="Surround Playback Volume" |
|
|
|
|
|
|
|
## Debugging output |
|
|
|
#LOG_FILE=~/.audio-toggle.log |
|
|
|
#echo "=== $(date) ===" >> $LOG_FILE |
|
|
|
|
|
|
|
## Get current active output (PulseAudio fallback) |
|
|
|
#get_active_output() { |
|
|
|
## Get full sink info for debugging |
|
|
|
#SINK_INFO=$(pacmd list-sinks) |
|
|
|
#echo "Full sink info:" >> $LOG_FILE |
|
|
|
#echo "$SINK_INFO" >> $LOG_FILE |
|
|
|
|
|
|
|
## Try alternative port detection method |
|
|
|
#PORT=$(echo "$SINK_INFO" | awk -v sink="$SINK" ' |
|
|
|
#$1 == "name:" && $2 == "<"sink">" {active=1} |
|
|
|
#active && /active port:/ { |
|
|
|
## Extract port name between angle brackets |
|
|
|
#match($0, /<[^>]+>/) |
|
|
|
#port = substr($0, RSTART+1, RLENGTH-2) |
|
|
|
#print port |
|
|
|
#exit |
|
|
|
#} |
|
|
|
#') |
|
|
|
|
|
|
|
#echo "Raw port detection: $PORT" >> $LOG_FILE |
|
|
|
|
|
|
|
#if [[ "$PORT" == "analog-output-headphones" ]]; then |
|
|
|
#echo "front" |
|
|
|
#elif [[ "$PORT" == "analog-output-lineout" ]]; then |
|
|
|
#echo "rear" |
|
|
|
#else |
|
|
|
#echo "unknown" |
|
|
|
#fi |
|
|
|
#} |
|
|
|
|
|
|
|
## Switch outputs with hardware-level control |
|
|
|
#switch_output() { |
|
|
|
#echo "Starting switch to $1" >> $LOG_FILE |
|
|
|
|
|
|
|
## First disable both outputs |
|
|
|
#echo "Disabling both outputs" >> $LOG_FILE |
|
|
|
## ALSA controls |
|
|
|
#amixer -c $CARD set "$FRONT" mute >/dev/null |
|
|
|
#amixer -c $CARD set "$FRONT_VOL" 0% >/dev/null |
|
|
|
#amixer -c $CARD set "$REAR" mute >/dev/null |
|
|
|
#amixer -c $CARD set "$REAR_VOL" 0% >/dev/null |
|
|
|
## PulseAudio controls |
|
|
|
#pactl set-sink-mute "$SINK" 1 >/dev/null |
|
|
|
#sleep 0.2 |
|
|
|
|
|
|
|
#if [[ "$1" == "front" ]]; then |
|
|
|
#echo "Enabling front output" >> $LOG_FILE |
|
|
|
## Check if headphones port exists |
|
|
|
#if echo "$SINK_INFO" | grep -q "analog-output-headphones"; then |
|
|
|
#echo "Attempting to set port to analog-output-headphones" >> $LOG_FILE |
|
|
|
#if ! pacmd set-sink-port "$SINK" "analog-output-headphones" 2>>$LOG_FILE; then |
|
|
|
#echo "Port switch failed, trying alternative method" >> $LOG_FILE |
|
|
|
#pactl set-sink-port "$SINK" "analog-output-headphones" 2>>$LOG_FILE || true |
|
|
|
#fi |
|
|
|
#else |
|
|
|
#echo "Headphones port not available, using hardware controls only" >> $LOG_FILE |
|
|
|
#fi |
|
|
|
## Additional hardware control |
|
|
|
#amixer -c $CARD set 'Headphone' unmute >/dev/null |
|
|
|
#amixer -c $CARD set 'Speaker' mute >/dev/null |
|
|
|
#pactl set-sink-mute "$SINK" 0 >/dev/null |
|
|
|
## ALSA controls |
|
|
|
#amixer -c $CARD set "$FRONT" unmute >/dev/null |
|
|
|
#amixer -c $CARD set "$FRONT_VOL" 100% >/dev/null |
|
|
|
#OUTPUT=" FRONT" |
|
|
|
#else |
|
|
|
#echo "Enabling rear output" >> $LOG_FILE |
|
|
|
## PulseAudio controls |
|
|
|
#echo "Attempting to set port to analog-output-lineout" >> $LOG_FILE |
|
|
|
#if ! pacmd set-sink-port "$SINK" "analog-output-lineout" 2>>$LOG_FILE; then |
|
|
|
#echo "Port switch failed, trying alternative method" >> $LOG_FILE |
|
|
|
#pactl set-sink-port "$SINK" "analog-output-lineout" 2>>$LOG_FILE || true |
|
|
|
#fi |
|
|
|
## Additional hardware control |
|
|
|
#amixer -c $CARD set 'Speaker' unmute >/dev/null |
|
|
|
#amixer -c $CARD set 'Headphone' mute >/dev/null |
|
|
|
#pactl set-sink-mute "$SINK" 0 >/dev/null |
|
|
|
## ALSA controls |
|
|
|
#amixer -c $CARD set "$REAR" unmute >/dev/null |
|
|
|
#amixer -c $CARD set "$REAR_VOL" 100% >/dev/null |
|
|
|
#OUTPUT=" REAR" |
|
|
|
#fi |
|
|
|
|
|
|
|
## Reset audio pipeline |
|
|
|
#echo "Resetting audio pipeline" >> $LOG_FILE |
|
|
|
#{ pactl suspend-sink "$SINK" 1 && sleep 0.2 && pactl suspend-sink "$SINK" 0; } >/dev/null 2>&1 |
|
|
|
|
|
|
|
## Verify switch |
|
|
|
#echo "Verifying switch..." >> $LOG_FILE |
|
|
|
#CURRENT=$(get_active_output) |
|
|
|
#echo "Current output: $CURRENT" >> $LOG_FILE |
|
|
|
#if [[ "$CURRENT" != "$1" ]]; then |
|
|
|
#echo "Switch verification failed!" >> $LOG_FILE |
|
|
|
## Force hardware-level switch |
|
|
|
#echo "Forcing hardware-level switch..." >> $LOG_FILE |
|
|
|
#if [[ "$1" == "front" ]]; then |
|
|
|
#amixer -c $CARD set 'Headphone' unmute >/dev/null |
|
|
|
#amixer -c $CARD set 'Speaker' mute >/dev/null |
|
|
|
#else |
|
|
|
#amixer -c $CARD set 'Speaker' unmute >/dev/null |
|
|
|
#amixer -c $CARD set 'Headphone' mute >/dev/null |
|
|
|
#fi |
|
|
|
#fi |
|
|
|
|
|
|
|
#echo "Switch complete" >> $LOG_FILE |
|
|
|
#echo "$OUTPUT" # Output to i3blocks |
|
|
|
#} |
|
|
|
|
|
|
|
## Main execution |
|
|
|
#case "${BLOCK_BUTTON:-}" in |
|
|
|
#1) |
|
|
|
#CURRENT=$(get_active_output) |
|
|
|
#if [[ "$CURRENT" == "front" ]]; then |
|
|
|
#switch_output "rear" |
|
|
|
#else |
|
|
|
#switch_output "front" |
|
|
|
#fi |
|
|
|
#;; |
|
|
|
#*) |
|
|
|
#CURRENT=$(get_active_output) |
|
|
|
#[[ "$CURRENT" == "front" ]] && echo " FRONT" || echo " REAR" |
|
|
|
#;; |
|
|
|
#esac |
|
|
|
|
|
|
|
#exit 0 |