1#!/bin/bash 2 3__cards () { 4 while IFS=$'\t' read idx name _; do 5 printf "%s %s\n" "$idx" "$name" 6 done < <(pactl list cards short 2> /dev/null) 7} 8 9__sinks () { 10 while IFS=$'\t' read _ name _ _ _; do 11 printf "%s\n" "$name" 12 done < <(pactl list sinks short 2> /dev/null) 13} 14 15__sinks_idx () { 16 while IFS=$'\t' read idx _ _ _ _; do 17 printf "%s\n" "$idx" 18 done < <(pactl list sinks short 2> /dev/null) 19} 20 21__sources () { 22 while IFS=$'\t' read _ name _ _ _; do 23 printf "%s\n" "$name" 24 done < <(pactl list sources short 2> /dev/null) 25} 26 27__sink_inputs () { 28 while IFS=$'\t' read idx _ _ _ _; do 29 printf "%s\n" "$idx" 30 done < <(pactl list sink-inputs short 2> /dev/null) 31} 32 33__source_outputs () { 34 while IFS=$'\t' read idx _ _ _ _; do 35 printf "%s\n" "$idx" 36 done < <(pactl list source-outputs short 2> /dev/null) 37} 38 39__ports () { 40 pactl list cards 2> /dev/null | awk -- \ 41 '/^\tPorts:/ { 42 flag=1; next 43 } 44 45 /^\t[A-Za-z]/ { 46 flag=0 47 } 48 49 flag { 50 if (/^\t\t[A-Za-z]/) 51 ports = ports substr($0, 3, index($0, ":")-3) " " 52 } 53 54 END { 55 print ports 56 }' 57} 58 59__profiles () { 60 pactl list cards 2> /dev/null | awk -- \ 61 '/^\tProfiles:/ { 62 flag=1; next 63 } 64 65 /^\t[A-Za-z]/ { 66 flag=0 67 } 68 69 flag { 70 if (/^\t\t[A-Za-z]/) 71 profiles = profiles substr($0, 3, index($0, ": ")-3) " " 72 } 73 74 END { 75 print profiles 76 }' 77} 78 79__all_modules () { 80 while read name; do 81 name=${name%% *} 82 printf "%s\n" "$name" 83 done < <(pulseaudio --dump-modules 2> /dev/null) 84} 85 86__loaded_modules () { 87 while IFS=$'\t' read idx name _; do 88 printf "%s %s\n" "$idx" "$name" 89 done < <(pactl list modules short 2> /dev/null) 90} 91 92__resample_methods () { 93 while read name; do 94 printf "%s\n" "$name" 95 done < <(pulseaudio --dump-resample-methods 2> /dev/null) 96} 97 98_pacat_file_formats () { 99 while IFS=$'\t' read name _; do 100 printf "%s\n" "$name" 101 done < <(pacat --list-file-formats 2> /dev/null) 102} 103 104in_array() { 105 local i 106 for i in "${@:2}"; do 107 [[ $1 = "$i" ]] && return 108 done 109} 110 111_pactl() { 112 local cur prev words cword preprev word command 113 local comps 114 local flags='-h --help --version -s --server= --client-name=' 115 local list_types='short sinks sources sink-inputs source-outputs cards 116 modules samples clients message-handlers' 117 local commands=(stat info list exit upload-sample play-sample remove-sample 118 load-module unload-module move-sink-input move-source-output 119 suspend-sink suspend-source set-card-profile get-default-sink 120 set-default-sink set-sink-port get-default-source set-default-source 121 set-source-port get-sink-volume set-sink-volume get-source-volume 122 set-source-volume set-sink-input-volume set-source-output-volume 123 get-sink-mute set-sink-mute get-source-mute set-source-mute 124 set-sink-input-mute set-source-output-mute set-sink-formats 125 set-port-latency-offset subscribe send-message help) 126 127 _init_completion -n = || return 128 preprev=${words[$cword-2]} 129 130 for word in "${COMP_WORDS[@]}"; do 131 if in_array "$word" "${commands[@]}"; then 132 command=$word 133 break 134 fi 135 done 136 137 case $preprev in 138 list) COMPREPLY=($(compgen -W 'short' -- "$cur")) ;; 139 140 play-sample) 141 comps=$(__sinks) 142 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 143 ;; 144 145 move-sink-input) 146 comps=$(__sinks) 147 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 148 ;; 149 150 move-source-output) 151 comps=$(__sources) 152 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 153 ;; 154 155 set-card-profile) 156 comps=$(__profiles) 157 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 158 ;; 159 160 set-*-port) 161 comps=$(__ports) 162 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 163 ;; 164 165 set-*-mute) COMPREPLY=($(compgen -W 'true false toggle' -- "$cur")) ;; 166 167 set-sink-formats) 168 ;; #TODO 169 170 set-port-*) 171 comps=$(__ports) 172 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 173 ;; 174 --server) 175 compopt +o nospace 176 _known_hosts_real "$cur" 177 ;; 178 esac 179 [[ $COMPREPLY ]] && return 0 180 181 case $prev in 182 list) COMPREPLY=($(compgen -W '${list_types[*]}' -- "$cur")) ;; 183 184 upload-sample) _filedir ;; 185 186 play-sample) ;; # TODO 187 188 remove-sample) ;; # TODO 189 190 get-default*) ;; 191 192 load-module) 193 comps=$(__all_modules) 194 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 195 ;; 196 197 unload-module) 198 comps=$(__loaded_modules) 199 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 200 ;; 201 202 set-card*) 203 comps=$(__cards) 204 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 205 ;; 206 207 *sink-input*) 208 comps=$(__sink_inputs) 209 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 210 ;; 211 212 *source-output*) 213 comps=$(__source_outputs) 214 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 215 ;; 216 217 set-sink-formats) 218 comps=$(__sinks_idx) 219 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 220 ;; 221 222 *sink*) 223 comps=$(__sinks) 224 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 225 ;; 226 227 *source*) 228 comps=$(__sources) 229 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 230 ;; 231 232 set-port*) 233 comps=$(__cards) 234 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 235 ;; 236 237 -s) 238 _known_hosts_real "$cur" ;; 239 esac 240 [[ $COMPREPLY ]] && return 0 241 242 case $cur in 243 --server=*) 244 cur=${cur#*=} 245 _known_hosts_real "$cur" 246 ;; 247 248 -*) 249 COMPREPLY=($(compgen -W '${flags[*]}' -- "$cur")) 250 [[ $COMPREPLY == *= ]] && compopt -o nospace 251 ;; 252 253 *) 254 [[ -z $command ]] && COMPREPLY=($(compgen -W '${commands[*]}' -- "$cur")) 255 ;; 256 esac 257} 258complete -F _pactl pactl 259 260_pacmd() { 261 local cur prev words cword preprev word command 262 local comps 263 local flags='-h --help --version' 264 local commands=(exit help list-modules list-cards list-sinks list-sources list-clients 265 list-samples list-sink-inputs list-source-outputs stat info 266 load-module unload-module describe-module set-sink-volume 267 set-source-volume set-sink-input-volume set-source-output-volume 268 set-sink-mute set-source-mut set-sink-input-mute 269 set-source-output-mute update-sink-proplist update-source-proplist 270 update-sink-input-proplist update-source-output-proplist 271 set-default-sink set-default-source kill-client kill-sink-input 272 kill-source-output play-sample remove-sample load-sample 273 load-sample-lazy load-sample-dir-lazy play-file dump 274 move-sink-input move-source-output suspend-sink suspend-source 275 suspend set-card-profile set-sink-port set-source-port 276 set-port-latency-offset set-log-target set-log-level set-log-meta 277 set-log-time set-log-backtrace send-message) 278 _init_completion -n = || return 279 preprev=${words[$cword-2]} 280 281 for word in "${COMP_WORDS[@]}"; do 282 if in_array "$word" "${commands[@]}"; then 283 command=$word 284 break 285 fi 286 done 287 288 case $preprev in 289 play-sample|play-file) 290 comps=$(__sinks) 291 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 292 ;; 293 294 load-sample*) _filedir ;; 295 296 move-sink-input) 297 comps=$(__sinks) 298 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 299 ;; 300 301 move-source-output) 302 comps=$(__sources) 303 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 304 ;; 305 306 set-card-profile) 307 comps=$(__profiles) 308 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 309 ;; 310 311 set-*port*) 312 comps=$(__ports) 313 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 314 ;; 315 316 set-*-mute) COMPREPLY=($(compgen -W 'true false' -- "$cur"));; 317 318 set-sink-formats) 319 ;; #TODO 320 esac 321 322 case $prev in 323 list-*) ;; 324 describe-module|load-module) 325 comps=$(__all_modules) 326 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 327 ;; 328 329 unload-module) 330 comps=$(__loaded_modules) 331 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 332 ;; 333 334 load-sample-dir-lazy) _filedir -d ;; 335 play-file) _filedir ;; 336 337 *sink-input*) 338 comps=$(__sink_inputs) 339 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 340 ;; 341 342 *source-output*) 343 comps=$(__source_outputs) 344 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 345 ;; 346 347 *sink*) 348 comps=$(__sinks) 349 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 350 ;; 351 352 *source*) 353 comps=$(__sources) 354 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 355 ;; 356 357 set-card*) 358 comps=$(__cards) 359 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 360 ;; 361 362 set-port-*) 363 comps=$(__cards) 364 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 365 ;; 366 367 set-log-target) 368 COMPREPLY=($(compgen -W 'auto syslog stderr file: newfile:' -- "$cur")) 369 ;; 370 371 set-log-level) 372 COMPREPLY=($(compgen -W '{0..4}' -- "$cur")) 373 ;; 374 375 set-log-meta|set-log-time|suspend) 376 COMPREPLY=($(compgen -W 'true false' -- "$cur")) 377 ;; 378 esac 379 380 case $cur in 381 -*) COMPREPLY=($(compgen -W '${flags[*]}' -- "$cur")) ;; 382 suspend) 383 COMPREPLY=($(compgen -W 'suspend suspend-sink suspend-source' -- "$cur")) 384 ;; 385 386 load-sample) 387 COMPREPLY=($(compgen -W 'load-sample load-sample-lazy load-sample-dir-lazy' -- "$cur")) 388 ;; 389 390 *) 391 [[ -z $command ]] && COMPREPLY=($(compgen -W '${commands[*]}' -- "$cur")) 392 ;; 393 esac 394} 395complete -F _pacmd pacmd 396 397_pasuspender () { 398 local cur prev 399 local flags='-h --help --version -s --server=' 400 401 _init_completion -n = || return 402 403 case $cur in 404 --server=*) 405 cur=${cur#*=} 406 _known_hosts_real "$cur" 407 ;; 408 409 -*) 410 COMPREPLY=($(compgen -W '${flags[*]}' -- "$cur")) 411 [[ $COMPREPLY == *= ]] && compopt -o nospace 412 ;; 413 esac 414 415 case $prev in 416 -s) _known_hosts_real "$cur" ;; 417 esac 418} 419complete -F _pasuspender pasuspender 420 421_padsp () { 422 local cur prev 423 local flags='-h -s -n -m -M -S -D -d' 424 425 _get_comp_words_by_ref cur prev 426 427 case $cur in 428 -*) COMPREPLY=($(compgen -W '${flags[*]}' -- "$cur")) ;; 429 esac 430 431 case $prev in 432 -s) _known_hosts_real "$cur" ;; 433 esac 434} 435complete -F _padsp padsp 436 437_pacat () { 438 local cur prev comps 439 local flags='-h --help --version -r --record -p --playback -v --verbose -s 440 --server= -d --device= -n --client-name= --stream-name= --volume= 441 --rate= --format= --channels= --channel-map= --fix-format --fix-rate 442 --fix-channels --no-remix --no-remap --latency= --process-time= 443 --latency-msec= --process-time-msec= --property= --raw --passthrough 444 --file-format= --list-file-formats --monitor-stream=' 445 446 _init_completion -n = || return 447 448 case $cur in 449 --server=*) 450 cur=${cur#*=} 451 _known_hosts_real "$cur" 452 ;; 453 454 --device=*) 455 cur=${cur#*=} 456 comps=$(__sinks) 457 comps+=" "$(__sources) 458 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 459 ;; 460 461 --monitor-stream=*) 462 cur=${cur#*=} 463 comps=$(__sink_inputs) 464 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 465 ;; 466 467 --rate=*) 468 cur=${cur#*=} 469 COMPREPLY=($(compgen -W '32000 44100 48000 9600 192000' -- "$cur")) 470 ;; 471 472 --file-format=*) 473 cur=${cur#*=} 474 comps=$(_pacat_file_formats) 475 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 476 ;; 477 478 --*=*) 479 ;; 480 481 -*) 482 COMPREPLY=($(compgen -W '${flags[*]}' -- "$cur")) 483 [[ $COMPREPLY == *= ]] && compopt -o nospace 484 ;; 485 *) _filedir ;; 486 esac 487 488 case $prev in 489 -s) _known_hosts_real "$cur" ;; 490 -d) 491 comps=$(__sinks) 492 comps+=" "$(__sources) 493 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 494 ;; 495 esac 496} 497complete -F _pacat pacat paplay parec parecord 498 499_pulseaudio() 500{ 501 local cur prev words cword 502 local flags='-h --help --version --dump-conf --dump-resample-methods --cleanup-shm 503 --start -k --kill --check --system= -D --daemonize= --fail= --high-priority= 504 --realtime= --disallow-module-loading= --disallow-exit= --exit-idle-time= 505 --scache-idle-time= --log-level= -v --log-target= --log-meta= --log-time= 506 --log-backtrace= -p --dl-search-path= --resample-method= --use-pid-file= 507 --no-cpu-limit= --disable-shm= --enable-memfd= -L --load= -F --file= -C -n' 508 _init_completion -n = || return 509 510 case $cur in 511 --system=*|--daemonize=*|--fail=*|--high-priority=*|--realtime=*| \ 512 --disallow-*=*|--log-meta=*|--log-time=*|--use-pid-file=*| \ 513 --no-cpu-limit=*|--disable-shm=*|--enable-memfd=*) 514 cur=${cur#*=} 515 COMPREPLY=($(compgen -W 'true false' -- "$cur")) 516 ;; 517 518 --log-target=*) 519 cur=${cur#*=} 520 COMPREPLY=($(compgen -W 'auto syslog stderr file: newfile:' -- "$cur")) 521 ;; 522 523 --log-level=*) 524 cur=${cur#*=} 525 COMPREPLY=($(compgen -W '{0..4}' -- "$cur")) 526 ;; 527 528 --dl-search-path=*) 529 cur=${cur#*=} 530 _filedir -d 531 ;; 532 533 --file=*) 534 cur=${cur#*=} 535 _filedir 536 ;; 537 538 --resample-method=*) 539 cur=${cur#*=} 540 comps=$(__resample_methods) 541 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 542 ;; 543 544 --load=*) 545 cur=${cur#*=} 546 comps=$(__all_modules) 547 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 548 ;; 549 550 --*=*) 551 ;; 552 553 -*) 554 COMPREPLY=($(compgen -W '${flags[*]}' -- "$cur")) 555 [[ $COMPREPLY == *= ]] && compopt -o nospace 556 ;; 557 esac 558 559 case $prev in 560 -D) COMPREPLY=($(compgen -W 'true false' -- "$cur")) ;; 561 -p) _filedir -d ;; 562 -F) _filedir ;; 563 -L) 564 cur=${cur#*=} 565 comps=$(__all_modules) 566 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur")) 567 ;; 568 esac 569} 570complete -F _pulseaudio pulseaudio 571 572#vim: set ft=zsh sw=4 ts=4 noet 573