153a5a1b3Sopenharmony_ci#compdef pulseaudio pactl pacmd pacat paplay parec parecord padsp pasuspender
253a5a1b3Sopenharmony_ci
353a5a1b3Sopenharmony_ci_set_remote() {
453a5a1b3Sopenharmony_ci    for (( i = 0; i < ${#words[@]}; i++ )) do
553a5a1b3Sopenharmony_ci        if [[ ${words[$i]} == -s || ${words[$i]} == --server ]]; then
653a5a1b3Sopenharmony_ci            remote="-s ${words[$i+1]}"
753a5a1b3Sopenharmony_ci            break;
853a5a1b3Sopenharmony_ci        elif [[ ${words[$i]} == --server=* ]]; then
953a5a1b3Sopenharmony_ci            remote=${words[$i]}
1053a5a1b3Sopenharmony_ci        fi
1153a5a1b3Sopenharmony_ci    done
1253a5a1b3Sopenharmony_ci}
1353a5a1b3Sopenharmony_ci
1453a5a1b3Sopenharmony_ci_devices() {
1553a5a1b3Sopenharmony_ci    local -a _device_list
1653a5a1b3Sopenharmony_ci    local cmd _device _device_description
1753a5a1b3Sopenharmony_ci
1853a5a1b3Sopenharmony_ci    if [[ $service == pactl  || $service == pacmd ]]; then
1953a5a1b3Sopenharmony_ci        case $words[$((CURRENT - 1))] in
2053a5a1b3Sopenharmony_ci            set-sink-input-*) cmd=('sink-inputs');;
2153a5a1b3Sopenharmony_ci            set-sink-*) cmd=('sinks');;
2253a5a1b3Sopenharmony_ci            set-default-sink) cmd=('sinks');;
2353a5a1b3Sopenharmony_ci            set-default-source) cmd=('sources');;
2453a5a1b3Sopenharmony_ci            set-source-output-*) cmd=('source-outputs');;
2553a5a1b3Sopenharmony_ci            set-source-*) cmd=('sources');;
2653a5a1b3Sopenharmony_ci            suspend-sink) cmd=('sinks');;
2753a5a1b3Sopenharmony_ci            suspend-source) cmd=('sources');;
2853a5a1b3Sopenharmony_ci            move-sink-input) cmd=('sink-inputs');;
2953a5a1b3Sopenharmony_ci            move-source-output) cmd=('source-outputs');;
3053a5a1b3Sopenharmony_ci            kill-sink-input) cmd=('sink-inputs');;
3153a5a1b3Sopenharmony_ci            kill-source-output) cmd=('source-outputs');;
3253a5a1b3Sopenharmony_ci        esac
3353a5a1b3Sopenharmony_ci
3453a5a1b3Sopenharmony_ci        case $words[$((CURRENT - 2))] in
3553a5a1b3Sopenharmony_ci            move-sink-input) cmd=('sinks');;
3653a5a1b3Sopenharmony_ci            move-source-output) cmd=('sources');;
3753a5a1b3Sopenharmony_ci            play-sample) cmd=('sinks');;
3853a5a1b3Sopenharmony_ci        esac
3953a5a1b3Sopenharmony_ci
4053a5a1b3Sopenharmony_ci    elif [[ $service == (pacat|paplay|parec|parecord) ]]; then
4153a5a1b3Sopenharmony_ci        case $words[$((CURRENT))] in
4253a5a1b3Sopenharmony_ci            --device=*)
4353a5a1b3Sopenharmony_ci                if [[ $words == *(--playback|-p)[[:space:]]* ||
4453a5a1b3Sopenharmony_ci                    $service == paplay ]]; then
4553a5a1b3Sopenharmony_ci                    cmd=('sinks')
4653a5a1b3Sopenharmony_ci                elif [[ $words == *(--record|-r)[[:space:]]* ||
4753a5a1b3Sopenharmony_ci                    $service == (parec|parecord) ]]; then
4853a5a1b3Sopenharmony_ci                    cmd=('sources')
4953a5a1b3Sopenharmony_ci                else
5053a5a1b3Sopenharmony_ci                    cmd=('sinks' 'sources')
5153a5a1b3Sopenharmony_ci                fi
5253a5a1b3Sopenharmony_ci                ;;
5353a5a1b3Sopenharmony_ci            --monitor-stream=*) cmd=('sink-inputs');;
5453a5a1b3Sopenharmony_ci        esac
5553a5a1b3Sopenharmony_ci
5653a5a1b3Sopenharmony_ci        case $words[$((CURRENT - 1))] in
5753a5a1b3Sopenharmony_ci            -d)
5853a5a1b3Sopenharmony_ci                if [[ $words == *(--playback|-p)[[:space:]]* ||
5953a5a1b3Sopenharmony_ci                    $service == paplay ]]; then
6053a5a1b3Sopenharmony_ci                    cmd=('sinks')
6153a5a1b3Sopenharmony_ci                elif [[ $words == *(--record|-r)[[:space:]]* ||
6253a5a1b3Sopenharmony_ci                    $service == (parec|parecord) ]]; then
6353a5a1b3Sopenharmony_ci                    cmd=('sources')
6453a5a1b3Sopenharmony_ci                else
6553a5a1b3Sopenharmony_ci                    cmd=('sinks' 'sources')
6653a5a1b3Sopenharmony_ci                fi
6753a5a1b3Sopenharmony_ci                ;;
6853a5a1b3Sopenharmony_ci        esac
6953a5a1b3Sopenharmony_ci
7053a5a1b3Sopenharmony_ci    fi
7153a5a1b3Sopenharmony_ci
7253a5a1b3Sopenharmony_ci    for target in $cmd; do
7353a5a1b3Sopenharmony_ci        for device_info in ${(ps:\n\n:)"$(_call_program device_tag "pactl $remote list $target 2> /dev/null")"}; do
7453a5a1b3Sopenharmony_ci            for line in ${(f)device_info}; do
7553a5a1b3Sopenharmony_ci                if [[ $target == (sink-inputs|source-outputs) ]]; then
7653a5a1b3Sopenharmony_ci                    if [[ $line == (Sink*Input|Source*Output)* ]]; then
7753a5a1b3Sopenharmony_ci                        _device=${line#*\#}
7853a5a1b3Sopenharmony_ci                    elif [[ $line == *application.name* ]]; then
7953a5a1b3Sopenharmony_ci                        _device_description=${line#*= }
8053a5a1b3Sopenharmony_ci                    fi
8153a5a1b3Sopenharmony_ci
8253a5a1b3Sopenharmony_ci                else
8353a5a1b3Sopenharmony_ci                    if [[ $words[$((CURRENT - 1))] == *set-sink-formats* ]]; then
8453a5a1b3Sopenharmony_ci                        if [[ $line == Sink* ]]; then
8553a5a1b3Sopenharmony_ci                            _device=${line#*\#}
8653a5a1b3Sopenharmony_ci                        elif [[ $line == *Description:* ]]; then
8753a5a1b3Sopenharmony_ci                            _device_description=${line#*: }
8853a5a1b3Sopenharmony_ci                        fi
8953a5a1b3Sopenharmony_ci
9053a5a1b3Sopenharmony_ci                    else
9153a5a1b3Sopenharmony_ci                        if [[ $line == *Name:* ]]; then
9253a5a1b3Sopenharmony_ci                            _device=${line#*: }
9353a5a1b3Sopenharmony_ci                        elif [[ $line == *Description:* ]]; then
9453a5a1b3Sopenharmony_ci                            _device_description=${line#*: }
9553a5a1b3Sopenharmony_ci                        fi
9653a5a1b3Sopenharmony_ci                    fi
9753a5a1b3Sopenharmony_ci                fi
9853a5a1b3Sopenharmony_ci            done
9953a5a1b3Sopenharmony_ci            _device_list+=($_device:$_device_description)
10053a5a1b3Sopenharmony_ci        done
10153a5a1b3Sopenharmony_ci    done
10253a5a1b3Sopenharmony_ci
10353a5a1b3Sopenharmony_ci    _describe 'device list' _device_list
10453a5a1b3Sopenharmony_ci}
10553a5a1b3Sopenharmony_ci
10653a5a1b3Sopenharmony_ci_profiles() {
10753a5a1b3Sopenharmony_ci    local -a _profile_list
10853a5a1b3Sopenharmony_ci    local _current_card _raw_profiles _profile_name _profile_description
10953a5a1b3Sopenharmony_ci
11053a5a1b3Sopenharmony_ci    _current_card=$words[$((CURRENT - 1))]
11153a5a1b3Sopenharmony_ci
11253a5a1b3Sopenharmony_ci    for card in ${(ps:\n\n:)"$(_call_program profiles_tag "pactl $remote list cards 2> /dev/null")"}; do
11353a5a1b3Sopenharmony_ci        if [[ $card == *$_current_card* ]]; then
11453a5a1b3Sopenharmony_ci            _raw_profiles=${card##*Profiles:}
11553a5a1b3Sopenharmony_ci            _raw_profiles=${_raw_profiles%%Active Profile:*}
11653a5a1b3Sopenharmony_ci            for profile in ${(f)_raw_profiles}; do
11753a5a1b3Sopenharmony_ci                if [[ $profile != [[:blank:]] ]]; then
11853a5a1b3Sopenharmony_ci                    _profile_name=${profile%%: *}
11953a5a1b3Sopenharmony_ci                    _profile_name=${_profile_name//[[:blank:]]/}
12053a5a1b3Sopenharmony_ci                    _profile_name=${_profile_name//:/\\:}
12153a5a1b3Sopenharmony_ci                    _profile_description=${profile#*: }
12253a5a1b3Sopenharmony_ci                    _profile_list+=($_profile_name:$_profile_description)
12353a5a1b3Sopenharmony_ci                fi
12453a5a1b3Sopenharmony_ci            done
12553a5a1b3Sopenharmony_ci        fi
12653a5a1b3Sopenharmony_ci    done
12753a5a1b3Sopenharmony_ci
12853a5a1b3Sopenharmony_ci    _describe 'profile list' _profile_list
12953a5a1b3Sopenharmony_ci}
13053a5a1b3Sopenharmony_ci
13153a5a1b3Sopenharmony_ci_ports() {
13253a5a1b3Sopenharmony_ci    local -a _port_list
13353a5a1b3Sopenharmony_ci    local _raw_ports _port_name _port_description _current_device
13453a5a1b3Sopenharmony_ci
13553a5a1b3Sopenharmony_ci    case $words[$((CURRENT - 2))] in
13653a5a1b3Sopenharmony_ci        set-sink-port) cmd="sinks";;
13753a5a1b3Sopenharmony_ci        set-source-port) cmd="sources";;
13853a5a1b3Sopenharmony_ci        set-port-latency-offset) cmd="cards";;
13953a5a1b3Sopenharmony_ci    esac
14053a5a1b3Sopenharmony_ci
14153a5a1b3Sopenharmony_ci    _current_device=$words[$((CURRENT - 1))]
14253a5a1b3Sopenharmony_ci
14353a5a1b3Sopenharmony_ci    for device in ${(ps:\n\n:)"$(_call_program port_tag "pactl $remote list $cmd 2> /dev/null")"}; do
14453a5a1b3Sopenharmony_ci        if [[ $device == *Ports:* && $device == *$_current_device* ]]; then
14553a5a1b3Sopenharmony_ci            _raw_ports=${device##*Ports:}
14653a5a1b3Sopenharmony_ci            _raw_ports=${_raw_ports%%Active Port:*}
14753a5a1b3Sopenharmony_ci            for line in ${(f)_raw_ports}; do
14853a5a1b3Sopenharmony_ci                if [[ $line != [[:blank:]] &&
14953a5a1b3Sopenharmony_ci                    $line != (*Part?of*|*Properties:*|*device.icon_name*) ]]; then
15053a5a1b3Sopenharmony_ci                    _port_name=${line%%: *}
15153a5a1b3Sopenharmony_ci                    _port_name=${_port_name##[[:blank:]]#}
15253a5a1b3Sopenharmony_ci                    _port_description=${line#*: }
15353a5a1b3Sopenharmony_ci                    _port_list+=($_port_name:$_port_description)
15453a5a1b3Sopenharmony_ci                fi
15553a5a1b3Sopenharmony_ci            done
15653a5a1b3Sopenharmony_ci        fi
15753a5a1b3Sopenharmony_ci    done
15853a5a1b3Sopenharmony_ci
15953a5a1b3Sopenharmony_ci    _describe 'port list' _port_list
16053a5a1b3Sopenharmony_ci}
16153a5a1b3Sopenharmony_ci
16253a5a1b3Sopenharmony_ci_sample_names() {
16353a5a1b3Sopenharmony_ci    local -a _sample_names
16453a5a1b3Sopenharmony_ci    sample_names=(${${${(f)"$(_call_program samples_tag "pactl $remote list samples short 2> /dev/null")"}##[[:digit:]]#[[:blank:]]#}%%[[:blank:]]*})
16553a5a1b3Sopenharmony_ci
16653a5a1b3Sopenharmony_ci    _wanted pactl-samples expl 'sample list' compadd $sample_names
16753a5a1b3Sopenharmony_ci}
16853a5a1b3Sopenharmony_ci
16953a5a1b3Sopenharmony_ci_cards(){
17053a5a1b3Sopenharmony_ci    local -a _card_list
17153a5a1b3Sopenharmony_ci    local _card _cad_name
17253a5a1b3Sopenharmony_ci
17353a5a1b3Sopenharmony_ci    for card_info in ${(ps:\n\n:)"$(_call_program card_tag "pactl $remote list cards 2> /dev/null")"}; do
17453a5a1b3Sopenharmony_ci        for line in ${(f)card_info}; do
17553a5a1b3Sopenharmony_ci            if [[ $line == *Name:* ]]; then
17653a5a1b3Sopenharmony_ci                _card=${line#*: }
17753a5a1b3Sopenharmony_ci            elif [[ $line == *alsa.long_card_name* ]]; then
17853a5a1b3Sopenharmony_ci                _card_name=${line#*= \"}
17953a5a1b3Sopenharmony_ci                _card_name=${_card_name%at*}
18053a5a1b3Sopenharmony_ci            fi
18153a5a1b3Sopenharmony_ci        done
18253a5a1b3Sopenharmony_ci        _card_list+=($_card:$_card_name)
18353a5a1b3Sopenharmony_ci    done
18453a5a1b3Sopenharmony_ci
18553a5a1b3Sopenharmony_ci    _describe 'card list' _card_list
18653a5a1b3Sopenharmony_ci}
18753a5a1b3Sopenharmony_ci
18853a5a1b3Sopenharmony_ci_all_modules(){
18953a5a1b3Sopenharmony_ci    local -a _all_modules_list
19053a5a1b3Sopenharmony_ci    for module in ${(f)"$(_call_program modules_tag "pulseaudio --dump-modules 2> /dev/null")"}; do
19153a5a1b3Sopenharmony_ci        _all_modules_list+=${module%% *}
19253a5a1b3Sopenharmony_ci    done
19353a5a1b3Sopenharmony_ci    _describe 'module list' _all_modules_list
19453a5a1b3Sopenharmony_ci}
19553a5a1b3Sopenharmony_ci
19653a5a1b3Sopenharmony_ci_loaded_modules(){
19753a5a1b3Sopenharmony_ci    local -a _loaded_modules_list
19853a5a1b3Sopenharmony_ci
19953a5a1b3Sopenharmony_ci    for module in ${(f)"$(_call_program modules_tag "pactl $remote list modules short 2> /dev/null")"}; do
20053a5a1b3Sopenharmony_ci        _loaded_modules_list+=(${${(ps:\t:)module}[1]}:${${(ps:\t:)module}[2]})
20153a5a1b3Sopenharmony_ci    done
20253a5a1b3Sopenharmony_ci    _describe 'module list' _loaded_modules_list
20353a5a1b3Sopenharmony_ci}
20453a5a1b3Sopenharmony_ci
20553a5a1b3Sopenharmony_ci_resample_methods() {
20653a5a1b3Sopenharmony_ci    local -a _resample_method_list
20753a5a1b3Sopenharmony_ci    for method in ${(f)"$(_call_program modules_tag "pulseaudio --dump-resample-methods 2> /dev/null")"}; do
20853a5a1b3Sopenharmony_ci        _resample_method_list+=$method
20953a5a1b3Sopenharmony_ci    done
21053a5a1b3Sopenharmony_ci    _describe 'resample method list' _resample_method_list
21153a5a1b3Sopenharmony_ci}
21253a5a1b3Sopenharmony_ci
21353a5a1b3Sopenharmony_ci_clients() {
21453a5a1b3Sopenharmony_ci    local -a _client_list
21553a5a1b3Sopenharmony_ci    local _client _client_description
21653a5a1b3Sopenharmony_ci
21753a5a1b3Sopenharmony_ci    for client_info in ${(ps:\n\n:)"$(_call_program clients_tag "pactl $remote list clients 2> /dev/null")"}; do
21853a5a1b3Sopenharmony_ci        for line in ${(f)client_info}; do
21953a5a1b3Sopenharmony_ci            if [[ $line == Client[[:space:]]#* ]]; then
22053a5a1b3Sopenharmony_ci                _client=${line#*\#}
22153a5a1b3Sopenharmony_ci            elif [[ $line == *application.name* ]]; then
22253a5a1b3Sopenharmony_ci                _client_description=${line#*=}
22353a5a1b3Sopenharmony_ci            fi
22453a5a1b3Sopenharmony_ci        done
22553a5a1b3Sopenharmony_ci        _client_list+=($_client:$_client_description)
22653a5a1b3Sopenharmony_ci    done
22753a5a1b3Sopenharmony_ci    _describe 'client list' _client_list
22853a5a1b3Sopenharmony_ci}
22953a5a1b3Sopenharmony_ci
23053a5a1b3Sopenharmony_ci_pacat_file_formats() {
23153a5a1b3Sopenharmony_ci    local -a _file_format_list
23253a5a1b3Sopenharmony_ci    for format in ${(f)"$(_call_program fformats_tag "pacat --list-file-formats")"}; do
23353a5a1b3Sopenharmony_ci        _file_format_list+=(${${(ps:\t:)format}[1]}:${${(ps:\t:)format}[2]})
23453a5a1b3Sopenharmony_ci    done
23553a5a1b3Sopenharmony_ci    _describe 'file format list' _file_format_list
23653a5a1b3Sopenharmony_ci}
23753a5a1b3Sopenharmony_ci
23853a5a1b3Sopenharmony_ci_pactl_completion() {
23953a5a1b3Sopenharmony_ci    _set_remote
24053a5a1b3Sopenharmony_ci
24153a5a1b3Sopenharmony_ci    _pactl_command(){
24253a5a1b3Sopenharmony_ci        local -a _pactl_commands
24353a5a1b3Sopenharmony_ci
24453a5a1b3Sopenharmony_ci        _pactl_commands=(
24553a5a1b3Sopenharmony_ci            'help: show help and exit'
24653a5a1b3Sopenharmony_ci            'stat: dump statistics about the PulseAudio daemon'
24753a5a1b3Sopenharmony_ci            'info: dump info about the PulseAudio daemon'
24853a5a1b3Sopenharmony_ci            'list: list modules/sources/streams/cards etc...'
24953a5a1b3Sopenharmony_ci            'exit: ask the PulseAudio daemon to exit'
25053a5a1b3Sopenharmony_ci            'upload-sample: upload a sound from a file into the sample cache'
25153a5a1b3Sopenharmony_ci            'play-sample: play the specified sample from the sample cache'
25253a5a1b3Sopenharmony_ci            'remove-sample: remove the specified sample from the sample cache'
25353a5a1b3Sopenharmony_ci            'load-module: load a module'
25453a5a1b3Sopenharmony_ci            'unload-module: unload a module'
25553a5a1b3Sopenharmony_ci            'move-sink-input: move a stream to a sink'
25653a5a1b3Sopenharmony_ci            'move-source-output: move a recording stream to a source'
25753a5a1b3Sopenharmony_ci            'suspend-sink: suspend or resume a sink'
25853a5a1b3Sopenharmony_ci            'suspend-source: suspend or resume a source'
25953a5a1b3Sopenharmony_ci            'set-card-profile: set a card profile'
26053a5a1b3Sopenharmony_ci            'set-default-sink: set the default sink'
26153a5a1b3Sopenharmony_ci            'set-default-source: set the default source'
26253a5a1b3Sopenharmony_ci            'set-sink-port: set the sink port of a sink'
26353a5a1b3Sopenharmony_ci            'set-source-port: set the source port of a source'
26453a5a1b3Sopenharmony_ci            'set-port-latency-offset: set a latency offset on a port'
26553a5a1b3Sopenharmony_ci            'set-sink-volume: set the volume of a sink'
26653a5a1b3Sopenharmony_ci            'set-source-volume: set the volume of a source'
26753a5a1b3Sopenharmony_ci            'set-sink-input-volume: set the volume of a stream'
26853a5a1b3Sopenharmony_ci            'set-source-output-volume: set the volume of a recording stream'
26953a5a1b3Sopenharmony_ci            'set-sink-mute: mute a sink'
27053a5a1b3Sopenharmony_ci            'set-source-mute: mute a source'
27153a5a1b3Sopenharmony_ci            'set-sink-input-mute: mute a stream'
27253a5a1b3Sopenharmony_ci            'set-source-output-mute: mute a recording stream'
27353a5a1b3Sopenharmony_ci            'set-sink-formats: set supported formats of a sink'
27453a5a1b3Sopenharmony_ci            'send-message: send a message to a pulseaudio object'
27553a5a1b3Sopenharmony_ci            'subscribe: subscribe to events'
27653a5a1b3Sopenharmony_ci        )
27753a5a1b3Sopenharmony_ci
27853a5a1b3Sopenharmony_ci        _describe 'pactl commands' _pactl_commands
27953a5a1b3Sopenharmony_ci    }
28053a5a1b3Sopenharmony_ci
28153a5a1b3Sopenharmony_ci    _pactl_command_parameter() {
28253a5a1b3Sopenharmony_ci        local _command
28353a5a1b3Sopenharmony_ci
28453a5a1b3Sopenharmony_ci        _list_parameter() {
28553a5a1b3Sopenharmony_ci            local -a _objects;
28653a5a1b3Sopenharmony_ci
28753a5a1b3Sopenharmony_ci            _objects=(
28853a5a1b3Sopenharmony_ci                'modules: list loaded modules'
28953a5a1b3Sopenharmony_ci                'sinks: list available sinks'
29053a5a1b3Sopenharmony_ci                'sources: list available sources'
29153a5a1b3Sopenharmony_ci                'sink-inputs: list connected sink inputs'
29253a5a1b3Sopenharmony_ci                'source-outputs: list connected source outputs'
29353a5a1b3Sopenharmony_ci                'clients: list connected clients'
29453a5a1b3Sopenharmony_ci                'samples: list samples'
29553a5a1b3Sopenharmony_ci                'cards: list available cards'
29653a5a1b3Sopenharmony_ci                'message-handlers: list available message-handlers'
29753a5a1b3Sopenharmony_ci            )
29853a5a1b3Sopenharmony_ci
29953a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
30053a5a1b3Sopenharmony_ci                # We're completing the first parameter after "list".
30153a5a1b3Sopenharmony_ci                # "pactl list cards short" and "pactl list short cards" are
30253a5a1b3Sopenharmony_ci                # treated as equivalent by pactl, but here we only support the
30353a5a1b3Sopenharmony_ci                # first form, so "short" isn't a valid completion.
30453a5a1b3Sopenharmony_ci                _describe 'objects' _objects
30553a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
30653a5a1b3Sopenharmony_ci                # We're completing the second parameter after "list". As
30753a5a1b3Sopenharmony_ci                # explained in the previous comment, we only support the
30853a5a1b3Sopenharmony_ci                # "pactl list cards short" form, so "short" is the only valid
30953a5a1b3Sopenharmony_ci                # completion here.
31053a5a1b3Sopenharmony_ci                compadd short
31153a5a1b3Sopenharmony_ci            fi
31253a5a1b3Sopenharmony_ci        }
31353a5a1b3Sopenharmony_ci
31453a5a1b3Sopenharmony_ci        _play_sample_parameter() {
31553a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
31653a5a1b3Sopenharmony_ci                # We're completing the first parameter after "play-sample".
31753a5a1b3Sopenharmony_ci                _sample_names
31853a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
31953a5a1b3Sopenharmony_ci                # We're completing the second parameter after "play-sample".
32053a5a1b3Sopenharmony_ci                _devices
32153a5a1b3Sopenharmony_ci            fi
32253a5a1b3Sopenharmony_ci        }
32353a5a1b3Sopenharmony_ci
32453a5a1b3Sopenharmony_ci        _load_module_parameter() {
32553a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
32653a5a1b3Sopenharmony_ci                # We're completing the first parameter after "load-module".
32753a5a1b3Sopenharmony_ci                _all_modules
32853a5a1b3Sopenharmony_ci            else
32953a5a1b3Sopenharmony_ci                # We're completing the second or later parameter after
33053a5a1b3Sopenharmony_ci                # "load-module", i.e. the module arguments.
33153a5a1b3Sopenharmony_ci                # TODO: Implement module argument completion.
33253a5a1b3Sopenharmony_ci            fi
33353a5a1b3Sopenharmony_ci        }
33453a5a1b3Sopenharmony_ci
33553a5a1b3Sopenharmony_ci        _move_sink_input_parameter() {
33653a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
33753a5a1b3Sopenharmony_ci                # We're completing the first parameter after "move-sink-input".
33853a5a1b3Sopenharmony_ci                # Even though the function name is "_devices", it actually
33953a5a1b3Sopenharmony_ci                # completes the sink input index. _devices is magical like
34053a5a1b3Sopenharmony_ci                # that.
34153a5a1b3Sopenharmony_ci                _devices
34253a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
34353a5a1b3Sopenharmony_ci                # We're completing the second parameter after
34453a5a1b3Sopenharmony_ci                # "move-sink-input".
34553a5a1b3Sopenharmony_ci                _devices
34653a5a1b3Sopenharmony_ci            fi
34753a5a1b3Sopenharmony_ci        }
34853a5a1b3Sopenharmony_ci
34953a5a1b3Sopenharmony_ci        _move_source_output_parameter() {
35053a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
35153a5a1b3Sopenharmony_ci                # We're completing the first parameter after
35253a5a1b3Sopenharmony_ci                # "move-source-output". Even though the function name is
35353a5a1b3Sopenharmony_ci                # "_devices", it actually completes the source output index.
35453a5a1b3Sopenharmony_ci                # _devices is magical like that.
35553a5a1b3Sopenharmony_ci                _devices
35653a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
35753a5a1b3Sopenharmony_ci                # We're completing the second parameter after
35853a5a1b3Sopenharmony_ci                # "move-source-output".
35953a5a1b3Sopenharmony_ci                _devices
36053a5a1b3Sopenharmony_ci            fi
36153a5a1b3Sopenharmony_ci        }
36253a5a1b3Sopenharmony_ci
36353a5a1b3Sopenharmony_ci        _suspend_sink_parameter() {
36453a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
36553a5a1b3Sopenharmony_ci                # We're completing the first parameter after "suspend-sink".
36653a5a1b3Sopenharmony_ci                _devices
36753a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
36853a5a1b3Sopenharmony_ci                # We're completing the second parameter after "suspend-sink".
36953a5a1b3Sopenharmony_ci                compadd true false
37053a5a1b3Sopenharmony_ci            fi
37153a5a1b3Sopenharmony_ci        }
37253a5a1b3Sopenharmony_ci
37353a5a1b3Sopenharmony_ci        _suspend_source_parameter() {
37453a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
37553a5a1b3Sopenharmony_ci                # We're completing the first parameter after "suspend-source".
37653a5a1b3Sopenharmony_ci                _devices
37753a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
37853a5a1b3Sopenharmony_ci                # We're completing the second parameter after "suspend-source".
37953a5a1b3Sopenharmony_ci                compadd true false
38053a5a1b3Sopenharmony_ci            fi
38153a5a1b3Sopenharmony_ci        }
38253a5a1b3Sopenharmony_ci
38353a5a1b3Sopenharmony_ci        _set_card_profile_parameter() {
38453a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
38553a5a1b3Sopenharmony_ci                # We're completing the first parameter after
38653a5a1b3Sopenharmony_ci                # "set-card-profile".
38753a5a1b3Sopenharmony_ci                _cards
38853a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
38953a5a1b3Sopenharmony_ci                # We're completing the second parameter after
39053a5a1b3Sopenharmony_ci                # "set-card-profile".
39153a5a1b3Sopenharmony_ci                _profiles
39253a5a1b3Sopenharmony_ci            fi
39353a5a1b3Sopenharmony_ci        }
39453a5a1b3Sopenharmony_ci
39553a5a1b3Sopenharmony_ci        _set_sink_port_parameter() {
39653a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
39753a5a1b3Sopenharmony_ci                # We're completing the first parameter after "set-sink-port".
39853a5a1b3Sopenharmony_ci                _devices
39953a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
40053a5a1b3Sopenharmony_ci                # We're completing the second parameter after "set-sink-port".
40153a5a1b3Sopenharmony_ci                _ports
40253a5a1b3Sopenharmony_ci            fi
40353a5a1b3Sopenharmony_ci        }
40453a5a1b3Sopenharmony_ci
40553a5a1b3Sopenharmony_ci        _set_source_port_parameter() {
40653a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
40753a5a1b3Sopenharmony_ci                # We're completing the first parameter after "set-source-port".
40853a5a1b3Sopenharmony_ci                _devices
40953a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
41053a5a1b3Sopenharmony_ci                # We're completing the second parameter after
41153a5a1b3Sopenharmony_ci                # "set-source-port".
41253a5a1b3Sopenharmony_ci                _ports
41353a5a1b3Sopenharmony_ci            fi
41453a5a1b3Sopenharmony_ci        }
41553a5a1b3Sopenharmony_ci
41653a5a1b3Sopenharmony_ci        _set_sink_mute_parameter() {
41753a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
41853a5a1b3Sopenharmony_ci                # We're completing the first parameter after "set-sink-mute".
41953a5a1b3Sopenharmony_ci                _devices
42053a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
42153a5a1b3Sopenharmony_ci                # We're completing the second parameter after "set-sink-mute".
42253a5a1b3Sopenharmony_ci                compadd true false toggle
42353a5a1b3Sopenharmony_ci            fi
42453a5a1b3Sopenharmony_ci        }
42553a5a1b3Sopenharmony_ci
42653a5a1b3Sopenharmony_ci        _set_source_mute_parameter() {
42753a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
42853a5a1b3Sopenharmony_ci                # We're completing the first parameter after "set-source-mute".
42953a5a1b3Sopenharmony_ci                _devices
43053a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
43153a5a1b3Sopenharmony_ci                # We're completing the second parameter after
43253a5a1b3Sopenharmony_ci                # "set-source-mute".
43353a5a1b3Sopenharmony_ci                compadd true false toggle
43453a5a1b3Sopenharmony_ci            fi
43553a5a1b3Sopenharmony_ci        }
43653a5a1b3Sopenharmony_ci
43753a5a1b3Sopenharmony_ci        _set_sink_input_mute_parameter() {
43853a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
43953a5a1b3Sopenharmony_ci                # We're completing the first parameter after
44053a5a1b3Sopenharmony_ci                # "set-sink-input-mute". Even though the function name is
44153a5a1b3Sopenharmony_ci                # "_devices", it actually completes the sink input index.
44253a5a1b3Sopenharmony_ci                # _devices is magical like that.
44353a5a1b3Sopenharmony_ci                _devices
44453a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
44553a5a1b3Sopenharmony_ci                # We're completing the second parameter after
44653a5a1b3Sopenharmony_ci                # "set-sink-input-mute".
44753a5a1b3Sopenharmony_ci                compadd true false toggle
44853a5a1b3Sopenharmony_ci            fi
44953a5a1b3Sopenharmony_ci        }
45053a5a1b3Sopenharmony_ci
45153a5a1b3Sopenharmony_ci        _set_source_output_mute_parameter() {
45253a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
45353a5a1b3Sopenharmony_ci                # We're completing the first parameter after
45453a5a1b3Sopenharmony_ci                # "set-source-output-mute". Even though the function name is
45553a5a1b3Sopenharmony_ci                # "_devices", it actually completes the source output index.
45653a5a1b3Sopenharmony_ci                # _devices is magical like that.
45753a5a1b3Sopenharmony_ci                _devices
45853a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
45953a5a1b3Sopenharmony_ci                # We're completing the second parameter after
46053a5a1b3Sopenharmony_ci                # "set-source-output-mute".
46153a5a1b3Sopenharmony_ci                compadd true false toggle
46253a5a1b3Sopenharmony_ci            fi
46353a5a1b3Sopenharmony_ci        }
46453a5a1b3Sopenharmony_ci
46553a5a1b3Sopenharmony_ci        _set_port_latency_offset_parameter() {
46653a5a1b3Sopenharmony_ci            if ((CURRENT == 2)); then
46753a5a1b3Sopenharmony_ci                # We're completing the first parameter after
46853a5a1b3Sopenharmony_ci                # "set-port-latency-offset".
46953a5a1b3Sopenharmony_ci                _cards
47053a5a1b3Sopenharmony_ci            elif ((CURRENT == 3)); then
47153a5a1b3Sopenharmony_ci                # We're completing the second parameter after
47253a5a1b3Sopenharmony_ci                # "set-port-latency-offset".
47353a5a1b3Sopenharmony_ci                _ports
47453a5a1b3Sopenharmony_ci            fi
47553a5a1b3Sopenharmony_ci        }
47653a5a1b3Sopenharmony_ci
47753a5a1b3Sopenharmony_ci        _command=$words[1]
47853a5a1b3Sopenharmony_ci
47953a5a1b3Sopenharmony_ci        case $_command in
48053a5a1b3Sopenharmony_ci            list)                                  _list_parameter;;
48153a5a1b3Sopenharmony_ci            upload-sample)                         if ((CURRENT == 2)); then _files; fi;;
48253a5a1b3Sopenharmony_ci            play-sample)                           _play_sample_parameter;;
48353a5a1b3Sopenharmony_ci            remove-sample)                         if ((CURRENT == 2)); then _sample_names; fi;;
48453a5a1b3Sopenharmony_ci            load-module)                           _load_module_parameter;;
48553a5a1b3Sopenharmony_ci            unload-module)                         if ((CURRENT == 2)); then _loaded_modules; fi;;
48653a5a1b3Sopenharmony_ci            move-sink-input)                       _move_sink_input_parameter;;
48753a5a1b3Sopenharmony_ci            move-source-output)                    _move_source_output_parameter;;
48853a5a1b3Sopenharmony_ci            suspend-sink)                          _suspend_sink_parameter;;
48953a5a1b3Sopenharmony_ci            suspend-source)                        _suspend_source_parameter;;
49053a5a1b3Sopenharmony_ci            set-card-profile)                      _set_card_profile_parameter;;
49153a5a1b3Sopenharmony_ci            set-default-sink)                      if ((CURRENT == 2)); then _devices; fi;;
49253a5a1b3Sopenharmony_ci            set-default-source)                    if ((CURRENT == 2)); then _devices; fi;;
49353a5a1b3Sopenharmony_ci            set-sink-port)                         _set_sink_port_parameter;;
49453a5a1b3Sopenharmony_ci            set-source-port)                       _set_source_port_parameter;;
49553a5a1b3Sopenharmony_ci            set-sink-volume)                       if ((CURRENT == 2)); then _devices; fi;;
49653a5a1b3Sopenharmony_ci            set-source-volume)                     if ((CURRENT == 2)); then _devices; fi;;
49753a5a1b3Sopenharmony_ci            set-sink-input-volume)                 if ((CURRENT == 2)); then _devices; fi;;
49853a5a1b3Sopenharmony_ci            set-source-output-volume)              if ((CURRENT == 2)); then _devices; fi;;
49953a5a1b3Sopenharmony_ci            set-sink-mute)                         _set_sink_mute_parameter;;
50053a5a1b3Sopenharmony_ci            set-source-mute)                       _set_source_mute_parameter;;
50153a5a1b3Sopenharmony_ci            set-sink-input-mute)                   _set_sink_input_mute_parameter;;
50253a5a1b3Sopenharmony_ci            set-source-output-mute)                _set_source_output_mute_parameter;;
50353a5a1b3Sopenharmony_ci            set-sink-formats)                      if ((CURRENT == 2)); then _devices; fi;;
50453a5a1b3Sopenharmony_ci            set-port-latency-offset)               _set_port_latency_offset_parameter;;
50553a5a1b3Sopenharmony_ci        esac
50653a5a1b3Sopenharmony_ci    }
50753a5a1b3Sopenharmony_ci
50853a5a1b3Sopenharmony_ci    _arguments -C -S -A '-*' \
50953a5a1b3Sopenharmony_ci        {-h,--help}'[display help and exit]' \
51053a5a1b3Sopenharmony_ci        '--version[show version and exit]' \
51153a5a1b3Sopenharmony_ci        {-s,--server=}'[name of server to connect to]:host:_hosts' \
51253a5a1b3Sopenharmony_ci        {-n,--client-name=}'[client name to use]:name' \
51353a5a1b3Sopenharmony_ci        '::pactl command:_pactl_command' \
51453a5a1b3Sopenharmony_ci        '*::pactl command parameter:_pactl_command_parameter'
51553a5a1b3Sopenharmony_ci}
51653a5a1b3Sopenharmony_ci
51753a5a1b3Sopenharmony_ci_pacmd_completion() {
51853a5a1b3Sopenharmony_ci    _pacmd_command(){
51953a5a1b3Sopenharmony_ci        _pacmd_commands=(
52053a5a1b3Sopenharmony_ci            'help: show help and exit'
52153a5a1b3Sopenharmony_ci            'list-modules: list modules'
52253a5a1b3Sopenharmony_ci            'list-cards: list cards'
52353a5a1b3Sopenharmony_ci            'list-sinks: list sinks'
52453a5a1b3Sopenharmony_ci            'list-sources: list sources'
52553a5a1b3Sopenharmony_ci            'list-clients: list clients'
52653a5a1b3Sopenharmony_ci            'list-sink-inputs: list sink-inputs'
52753a5a1b3Sopenharmony_ci            'list-source-outputs: list source-outputs'
52853a5a1b3Sopenharmony_ci            'stat: dump statistics about the PulseAudio daemon'
52953a5a1b3Sopenharmony_ci            'info: dump info about the PulseAudio daemon'
53053a5a1b3Sopenharmony_ci            'load-module: load a module'
53153a5a1b3Sopenharmony_ci            'unload-module: unload a module'
53253a5a1b3Sopenharmony_ci            'describe-module: print info for a module'
53353a5a1b3Sopenharmony_ci            'set-sink-volume: set the volume of a sink'
53453a5a1b3Sopenharmony_ci            'set-source-volume: set the volume of a source'
53553a5a1b3Sopenharmony_ci            'set-sink-mute: mute a sink'
53653a5a1b3Sopenharmony_ci            'set-source-mute: mute a source'
53753a5a1b3Sopenharmony_ci            'set-sink-input-volume: set the volume of a stream'
53853a5a1b3Sopenharmony_ci            'set-source-output-volume: set the volume of a recording stream'
53953a5a1b3Sopenharmony_ci            'set-sink-input-mute: mute a stream'
54053a5a1b3Sopenharmony_ci            'set-source-output-mute: mute a recording stream'
54153a5a1b3Sopenharmony_ci            'set-default-sink: set the default sink'
54253a5a1b3Sopenharmony_ci            'set-default-source: set the default source'
54353a5a1b3Sopenharmony_ci            'set-card-profile: set a card profile'
54453a5a1b3Sopenharmony_ci            'set-sink-port: set the sink port of a sink'
54553a5a1b3Sopenharmony_ci            'set-source-port: set the source port of a source'
54653a5a1b3Sopenharmony_ci            'set-port-latency-offset: set a latency offset on a port'
54753a5a1b3Sopenharmony_ci            'suspend-sink: suspend or resume a sink'
54853a5a1b3Sopenharmony_ci            'suspend-source: suspend or resume a source'
54953a5a1b3Sopenharmony_ci            'suspend: suspend all sinks and sources'
55053a5a1b3Sopenharmony_ci            'move-sink-input: move a stream to a sink'
55153a5a1b3Sopenharmony_ci            'move-source-output: move a recording stream to a source'
55253a5a1b3Sopenharmony_ci            'update-sink-proplist: update the properties of a sink'
55353a5a1b3Sopenharmony_ci            'update-source-proplist: update the properties of a source'
55453a5a1b3Sopenharmony_ci            'update-sink-input-proplist: update the properties of a sink-input'
55553a5a1b3Sopenharmony_ci            'update-source-output-proplist: update the properties of a source-output'
55653a5a1b3Sopenharmony_ci            'list-samples: list samples'
55753a5a1b3Sopenharmony_ci            'play-sample: play the specified sample from the sample cache' # TODO
55853a5a1b3Sopenharmony_ci            'remove-sample: remove the specified sample from the sample cache' # TODO
55953a5a1b3Sopenharmony_ci            'load-sample: upload a sound from a file into the sample cache'
56053a5a1b3Sopenharmony_ci            'load-sample-lazy: lazily upload a sound file into the sample cache'
56153a5a1b3Sopenharmony_ci            'load-sample-dir-lazy: lazily upload all sound files in a directory into the sample cache'
56253a5a1b3Sopenharmony_ci            'kill-client: kill a client'
56353a5a1b3Sopenharmony_ci            'kill-sink-input: kill a sink input'
56453a5a1b3Sopenharmony_ci            'kill-source-output: kill a source output'
56553a5a1b3Sopenharmony_ci            'set-log-target: change the log target'
56653a5a1b3Sopenharmony_ci            'set-log-level: change the log level'
56753a5a1b3Sopenharmony_ci            'set-log-meta: show source code location in log messages'
56853a5a1b3Sopenharmony_ci            'set-log-time: show timestamps in log messages'
56953a5a1b3Sopenharmony_ci            'set-log-backtrace: show backtrace in log messages'
57053a5a1b3Sopenharmony_ci            'play-file: play a sound file'
57153a5a1b3Sopenharmony_ci            'dump: show daemon configuration'
57253a5a1b3Sopenharmony_ci            'dump-volumes: show the state of all volumes'
57353a5a1b3Sopenharmony_ci            'shared: show shared properties'
57453a5a1b3Sopenharmony_ci            'send-message: send a message to a pulseaudio object'
57553a5a1b3Sopenharmony_ci            'exit: ask the PulseAudio daemon to exit'
57653a5a1b3Sopenharmony_ci        )
57753a5a1b3Sopenharmony_ci        _describe 'pacmd commands' _pacmd_commands
57853a5a1b3Sopenharmony_ci    }
57953a5a1b3Sopenharmony_ci
58053a5a1b3Sopenharmony_ci    _arguments -C -S -A "-*" \
58153a5a1b3Sopenharmony_ci        {-h,--help}'[display help and exit]' \
58253a5a1b3Sopenharmony_ci        '--version[show version and exit]' \
58353a5a1b3Sopenharmony_ci        '::pacmd commands:_pacmd_command' \
58453a5a1b3Sopenharmony_ci
58553a5a1b3Sopenharmony_ci    case $words[$((CURRENT - 1))] in
58653a5a1b3Sopenharmony_ci        set-card-profile) _cards;;
58753a5a1b3Sopenharmony_ci        set-sink-*) _devices;;
58853a5a1b3Sopenharmony_ci        set-source-*) _devices;;
58953a5a1b3Sopenharmony_ci        load-module) _all_modules;;
59053a5a1b3Sopenharmony_ci        describe-module) _all_modules;;
59153a5a1b3Sopenharmony_ci        unload-module) _loaded_modules;;
59253a5a1b3Sopenharmony_ci        suspend-*) _devices;;
59353a5a1b3Sopenharmony_ci        move-*) _devices;;
59453a5a1b3Sopenharmony_ci        set-port-latency-offset) _cards;;
59553a5a1b3Sopenharmony_ci        load-sample*) _files;;
59653a5a1b3Sopenharmony_ci        kill-client) _clients;;
59753a5a1b3Sopenharmony_ci        kill-(sink|source)-*) _devices;;
59853a5a1b3Sopenharmony_ci        set-log-target) compadd null auto syslog stderr file:;;
59953a5a1b3Sopenharmony_ci        set-log-*) compadd true false;;
60053a5a1b3Sopenharmony_ci        play-file) _files;;
60153a5a1b3Sopenharmony_ci    esac
60253a5a1b3Sopenharmony_ci
60353a5a1b3Sopenharmony_ci    case $words[$((CURRENT - 2))] in
60453a5a1b3Sopenharmony_ci        set-card-profile) _profiles;;
60553a5a1b3Sopenharmony_ci        set-(sink|source)-port) _ports;;
60653a5a1b3Sopenharmony_ci        set-port-latency-offset) _ports;;
60753a5a1b3Sopenharmony_ci        set-*-mute) compadd true false;;
60853a5a1b3Sopenharmony_ci        suspend-*) compadd true false;;
60953a5a1b3Sopenharmony_ci        move-*) _devices;;
61053a5a1b3Sopenharmony_ci    esac
61153a5a1b3Sopenharmony_ci}
61253a5a1b3Sopenharmony_ci
61353a5a1b3Sopenharmony_ci_pasuspender_completion() {
61453a5a1b3Sopenharmony_ci    # parenthesis expressions specify which options should not get suggested afterwards
61553a5a1b3Sopenharmony_ci    # e.g. after -s, help and version will not get suggested, -- remains the only valid argument
61653a5a1b3Sopenharmony_ci    # after "--" external commands get suggested
61753a5a1b3Sopenharmony_ci    _arguments -C \
61853a5a1b3Sopenharmony_ci        '(-)'{-h,--help}'[display help and exit]' \
61953a5a1b3Sopenharmony_ci        '(-)--version[show version and exit]' \
62053a5a1b3Sopenharmony_ci        '(-h --help --version -s --server)'{-s,--server=}'[name of server to connect to]:host:_hosts' \
62153a5a1b3Sopenharmony_ci        '(-)--[program]:program: _command_names -e' && return 0
62253a5a1b3Sopenharmony_ci    # check if "--" is one of the words in the command line
62353a5a1b3Sopenharmony_ci    # if so, ${words[(i)--]} is the position of "--"
62453a5a1b3Sopenharmony_ci    # shift the arguments and reduce CURRENT, such that further completions see only what follows "--"
62553a5a1b3Sopenharmony_ci    if [[ ${words[(r)--]} == "--" ]]; then
62653a5a1b3Sopenharmony_ci        for ((j = ${words[(i)--]}; j > 0; j--));
62753a5a1b3Sopenharmony_ci        do
62853a5a1b3Sopenharmony_ci            shift words
62953a5a1b3Sopenharmony_ci            (( CURRENT-- ))
63053a5a1b3Sopenharmony_ci        done
63153a5a1b3Sopenharmony_ci        # proceed with normal completion
63253a5a1b3Sopenharmony_ci        _normal
63353a5a1b3Sopenharmony_ci    fi
63453a5a1b3Sopenharmony_ci}
63553a5a1b3Sopenharmony_ci
63653a5a1b3Sopenharmony_ci_padsp_completion() {
63753a5a1b3Sopenharmony_ci    _arguments -C -S -A "-*" \
63853a5a1b3Sopenharmony_ci        '-h[display help and exit]' \
63953a5a1b3Sopenharmony_ci        '-s[name of server to connect to]:host:_hosts' \
64053a5a1b3Sopenharmony_ci        '-n[client name to use]:name:' \
64153a5a1b3Sopenharmony_ci        '-m[stream name to use]:name:' \
64253a5a1b3Sopenharmony_ci        '-M[disable /dev/mixer emulation]' \
64353a5a1b3Sopenharmony_ci        '-S[disable /dev/sndstat emulation]' \
64453a5a1b3Sopenharmony_ci        '-D[disable /dev/dsp emulation]' \
64553a5a1b3Sopenharmony_ci        '-d[enable debug output]' \
64653a5a1b3Sopenharmony_ci        '--[disable further command line parsing]' \
64753a5a1b3Sopenharmony_ci}
64853a5a1b3Sopenharmony_ci
64953a5a1b3Sopenharmony_ci# TODO channel map completion
65053a5a1b3Sopenharmony_ci_pacat_completion() {
65153a5a1b3Sopenharmony_ci    _set_remote
65253a5a1b3Sopenharmony_ci
65353a5a1b3Sopenharmony_ci    _pacat_sample_formats=('s16le' 's16be' 'u8' 'float32le' 'float32be'
65453a5a1b3Sopenharmony_ci        'ulaw' 'alaw' 's32le' 's32be' 's24le' 's24-32le' 's24-32be')
65553a5a1b3Sopenharmony_ci
65653a5a1b3Sopenharmony_ci    _arguments -C -S -A "-*" \
65753a5a1b3Sopenharmony_ci        {-h,--help}'[display this help and exit]' \
65853a5a1b3Sopenharmony_ci        '--version[show version and exit]' \
65953a5a1b3Sopenharmony_ci        {-r,--record}'[create a connection for recording]' \
66053a5a1b3Sopenharmony_ci        {-p,--playback}'[create a connection for playback]' \
66153a5a1b3Sopenharmony_ci        {-s,--server=}'[name of server to connect to]:host:_hosts' \
66253a5a1b3Sopenharmony_ci        {-d,--device=}'[name of sink/source to connect to]:device:_devices' \
66353a5a1b3Sopenharmony_ci        '--monitor-stream=[index of the sink input to record from]:device:_devices' \
66453a5a1b3Sopenharmony_ci        {-n,--client-name=}'[client name to use]:name' \
66553a5a1b3Sopenharmony_ci        '--stream-name=[how to call this stream]:name' \
66653a5a1b3Sopenharmony_ci        '--volume=[initial volume to use]:volume' \
66753a5a1b3Sopenharmony_ci        '--rate=[sample rate to use]:rate:(44100 48000 96000)' \
66853a5a1b3Sopenharmony_ci        '--format=[sample type to use]:format:((${(q)_pacat_sample_formats}))' \
66953a5a1b3Sopenharmony_ci        '--channels=[number of channels to use]:number:(1 2)' \
67053a5a1b3Sopenharmony_ci        '--channel-map=[channel map to use]:map' \
67153a5a1b3Sopenharmony_ci        '--fix-format[use the sample format of the sink]' \
67253a5a1b3Sopenharmony_ci        '--fix-rate[use the rate of the sink]' \
67353a5a1b3Sopenharmony_ci        '--fix-channels[channel map of the sink]' \
67453a5a1b3Sopenharmony_ci        '--no-remix[do not upmix or downmix channels]' \
67553a5a1b3Sopenharmony_ci        '--no-remap[map channels by index instead of name]' \
67653a5a1b3Sopenharmony_ci        '--latency=[request the specified latency]:bytes' \
67753a5a1b3Sopenharmony_ci        '--process-time=[request the specified process time]:bytes' \
67853a5a1b3Sopenharmony_ci        '--latency-msec=[request the specified latency in msec]:msec' \
67953a5a1b3Sopenharmony_ci        '--process-time-msec=[request the specified process time in msec]:msec' \
68053a5a1b3Sopenharmony_ci        '--property=[set the specified property]:property' \
68153a5a1b3Sopenharmony_ci        '--raw[record/play raw PCM data]' \
68253a5a1b3Sopenharmony_ci        '--passthrough[passthrough data]' \
68353a5a1b3Sopenharmony_ci        '--file-format=[record/play formatted PCM data]:format:_pacat_file_formats' \
68453a5a1b3Sopenharmony_ci        '--list-file-formats[list available formats]' \
68553a5a1b3Sopenharmony_ci        '::files:_files' \
68653a5a1b3Sopenharmony_ci}
68753a5a1b3Sopenharmony_ci
68853a5a1b3Sopenharmony_ci# TODO log-target file completion
68953a5a1b3Sopenharmony_ci_pulseaudio_completion() {
69053a5a1b3Sopenharmony_ci    _arguments -C \
69153a5a1b3Sopenharmony_ci        {-h,--help}'[display this help and exit]' \
69253a5a1b3Sopenharmony_ci        '--version[show version and exit]' \
69353a5a1b3Sopenharmony_ci        '--dump-conf[show default configuration]' \
69453a5a1b3Sopenharmony_ci        '--dump-modules[show available modules]' \
69553a5a1b3Sopenharmony_ci        '--dump-resample-methods[show available resample methods]' \
69653a5a1b3Sopenharmony_ci        '--cleanup-shm[cleanup shared memory]' \
69753a5a1b3Sopenharmony_ci        '--start[start the daemon]' \
69853a5a1b3Sopenharmony_ci        {-k,--kill}'[kill a running daemon]' \
69953a5a1b3Sopenharmony_ci        '--check[check for a running daemon]' \
70053a5a1b3Sopenharmony_ci        '--system=[run as systemd-wide daemon]:bool:(true false)' \
70153a5a1b3Sopenharmony_ci        {-D,--daemonize=}'[daemonize after startup]:bool:(true false)' \
70253a5a1b3Sopenharmony_ci        '--fail=[quit when startup fails]:bool:(true false)' \
70353a5a1b3Sopenharmony_ci        '--high-priority=[try to set high nice level]:bool:(true false)' \
70453a5a1b3Sopenharmony_ci        '--realtime=[try to enable rt scheduling]:bool:(true false)' \
70553a5a1b3Sopenharmony_ci        '--disallow-module-loading=[disallow module loading]:bool:(true false)' \
70653a5a1b3Sopenharmony_ci        '--disallow-exit=[disallow user requested exit]' \
70753a5a1b3Sopenharmony_ci        '--exit-idle-time=[terminate the daemon on passed idle time]:time' \
70853a5a1b3Sopenharmony_ci        '--scache-idle-time=[unload autoloaded samples on passed idle time]:time' \
70953a5a1b3Sopenharmony_ci        '--log-level=[set the verbosity level]:level' \
71053a5a1b3Sopenharmony_ci        '-v[increase the verbosity level]' \
71153a5a1b3Sopenharmony_ci        '--log-target=[set the log target]:target:(auto syslog stderr file\: new_file\:):file' \
71253a5a1b3Sopenharmony_ci        '--log-meta=[include code location in log messages]:bool:(true false)' \
71353a5a1b3Sopenharmony_ci        '--log-time=[include timestamps in log messages]:bool:(true false)' \
71453a5a1b3Sopenharmony_ci        '--log-backtrace=[include backtrace in log messages]:frames' \
71553a5a1b3Sopenharmony_ci        {-p,--dl-search-path=}'[set the search path for plugins]:dir:_files' \
71653a5a1b3Sopenharmony_ci        '--resample-method=[set the resample method]:method:_resample_methods' \
71753a5a1b3Sopenharmony_ci        '--use-pid-file=[create a PID file]:bool:(true false)' \
71853a5a1b3Sopenharmony_ci        '--no-cpu-limit=[do not install CPU load limiter]:bool:(true false)' \
71953a5a1b3Sopenharmony_ci        '--disable-shm=[disable shared memory support]:bool:(true false)' \
72053a5a1b3Sopenharmony_ci        '--enable-memfd=[enable memfd shared memory support]:bool:(true false)' \
72153a5a1b3Sopenharmony_ci        {-L,--load=}'[load the specified module]:modules:_all_modules' \
72253a5a1b3Sopenharmony_ci        {-F,--file=}'[run the specified script]:file:_files' \
72353a5a1b3Sopenharmony_ci        '-C[open a command line on the running tty]' \
72453a5a1b3Sopenharmony_ci        '-n[do not load the default script file]' \
72553a5a1b3Sopenharmony_ci}
72653a5a1b3Sopenharmony_ci
72753a5a1b3Sopenharmony_ci_pulseaudio() {
72853a5a1b3Sopenharmony_ci    local state line curcontext="$curcontext"
72953a5a1b3Sopenharmony_ci
73053a5a1b3Sopenharmony_ci    # Some commands, like pactl and pacat, have an option for specifying the
73153a5a1b3Sopenharmony_ci    # server address, like "--server=somehost". If that option is set, then the
73253a5a1b3Sopenharmony_ci    # helper commands that are run as part of the autocompletion need to use
73353a5a1b3Sopenharmony_ci    # that same option. The option is saved in this variable in _set_remote(),
73453a5a1b3Sopenharmony_ci    # which is called in the beginning of _pactl_completion() and others. The
73553a5a1b3Sopenharmony_ci    # autocompletion commands can then find the option in that variable if the
73653a5a1b3Sopenharmony_ci    # option is set.
73753a5a1b3Sopenharmony_ci    local remote
73853a5a1b3Sopenharmony_ci
73953a5a1b3Sopenharmony_ci    case $service in
74053a5a1b3Sopenharmony_ci        pulseaudio) _pulseaudio_completion;;
74153a5a1b3Sopenharmony_ci        pactl) _pactl_completion;;
74253a5a1b3Sopenharmony_ci        pacmd) _pacmd_completion;;
74353a5a1b3Sopenharmony_ci        pacat) _pacat_completion;;
74453a5a1b3Sopenharmony_ci        paplay)_pacat_completion;;
74553a5a1b3Sopenharmony_ci        parec) _pacat_completion;;
74653a5a1b3Sopenharmony_ci        parecord)_pacat_completion;;
74753a5a1b3Sopenharmony_ci        padsp) _padsp_completion;;
74853a5a1b3Sopenharmony_ci        pasuspender) _pasuspender_completion;;
74953a5a1b3Sopenharmony_ci        *) _message "Err";;
75053a5a1b3Sopenharmony_ci    esac
75153a5a1b3Sopenharmony_ci}
75253a5a1b3Sopenharmony_ci
75353a5a1b3Sopenharmony_ci_pulseaudio "$@"
75453a5a1b3Sopenharmony_ci
75553a5a1b3Sopenharmony_ci#vim: set ft=zsh sw=4 ts=4 noet
756