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