Packages

Gleam SDK for Rockbox Zig — pipe-friendly client for the rockboxd GraphQL API

Current section

Files

Jump to
rockbox src rockbox@settings.erl
Raw

src/rockbox@settings.erl

-module(rockbox@settings).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/rockbox/settings.gleam").
-export([get/1, patch/0, set_music_dir/2, set_volume/2, set_balance/2, set_bass/2, set_treble/2, set_channel_config/2, set_stereo_width/2, set_eq_enabled/2, set_eq_precut/2, set_eq_bands/2, set_replaygain/2, set_compressor/2, set_crossfade_enabled/2, set_crossfade_fade_in_delay/2, set_crossfade_fade_in_duration/2, set_crossfade_fade_out_delay/2, set_crossfade_fade_out_duration/2, set_crossfade_fade_out_mixmode/2, set_crossfeed_enabled/2, set_crossfeed_direct_gain/2, set_crossfeed_cross_gain/2, set_crossfeed_hf_attenuation/2, set_crossfeed_hf_cutoff/2, set_repeat_mode/2, set_single_mode/2, set_party_mode/2, set_shuffle/2, set_player_name/2, save/2]).
-export_type([patch/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" Read and patch the global daemon settings (volume, EQ, crossfeed, …).\n"
"\n"
" Use the `update_*` builders to construct a partial update — only the\n"
" fields you set are sent to the server:\n"
"\n"
" ```gleam\n"
" let patch =\n"
" settings.patch()\n"
" |> settings.set_volume(-20)\n"
" |> settings.set_shuffle(True)\n"
"\n"
" let assert Ok(_) = settings.save(client, patch)\n"
" ```\n"
).
-opaque patch() :: {patch, list({binary(), gleam@json:json()})}.
-file("src/rockbox/settings.gleam", 26).
?DOC(" Read every settings field.\n").
-spec get(rockbox:client()) -> {ok, rockbox@types:user_settings()} |
{error, rockbox@error:error()}.
get(Client) ->
Decoder = begin
gleam@dynamic@decode:field(
<<"globalSettings"/utf8>>,
rockbox@types:user_settings_decoder(),
fun(Settings) -> gleam@dynamic@decode:success(Settings) end
)
end,
rockbox:'query'(
Client,
<<"query GlobalSettings {
globalSettings {
musicDir volume balance bass treble channelConfig stereoWidth
eqEnabled eqPrecut
eqBandSettings { cutoff q gain }
replaygainSettings { noclip type preamp }
compressorSettings { threshold makeupGain ratio knee releaseTime attackTime }
crossfadeEnabled crossfadeFadeInDelay crossfadeFadeInDuration
crossfadeFadeOutDelay crossfadeFadeOutDuration crossfadeFadeOutMixmode
crossfeedEnabled crossfeedDirectGain crossfeedCrossGain
crossfeedHfAttenuation crossfeedHfCutoff
repeatMode singleMode partyMode shuffle playerName
}
}"/utf8>>,
gleam@json:object([]),
Decoder
).
-file("src/rockbox/settings.gleam", 61).
?DOC(" Empty patch — chain `set_*` to populate.\n").
-spec patch() -> patch().
patch() ->
{patch, []}.
-file("src/rockbox/settings.gleam", 65).
-spec set(patch(), binary(), gleam@json:json()) -> patch().
set(Patch, Key, Value) ->
{patch, [{Key, Value} | erlang:element(2, Patch)]}.
-file("src/rockbox/settings.gleam", 69).
-spec set_music_dir(patch(), binary()) -> patch().
set_music_dir(Patch, Value) ->
set(Patch, <<"musicDir"/utf8>>, gleam@json:string(Value)).
-file("src/rockbox/settings.gleam", 73).
-spec set_volume(patch(), integer()) -> patch().
set_volume(Patch, Value) ->
set(Patch, <<"volume"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 77).
-spec set_balance(patch(), integer()) -> patch().
set_balance(Patch, Value) ->
set(Patch, <<"balance"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 81).
-spec set_bass(patch(), integer()) -> patch().
set_bass(Patch, Value) ->
set(Patch, <<"bass"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 85).
-spec set_treble(patch(), integer()) -> patch().
set_treble(Patch, Value) ->
set(Patch, <<"treble"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 89).
-spec set_channel_config(patch(), integer()) -> patch().
set_channel_config(Patch, Value) ->
set(Patch, <<"channelConfig"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 93).
-spec set_stereo_width(patch(), integer()) -> patch().
set_stereo_width(Patch, Value) ->
set(Patch, <<"stereoWidth"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 97).
-spec set_eq_enabled(patch(), boolean()) -> patch().
set_eq_enabled(Patch, Value) ->
set(Patch, <<"eqEnabled"/utf8>>, gleam@json:bool(Value)).
-file("src/rockbox/settings.gleam", 101).
-spec set_eq_precut(patch(), integer()) -> patch().
set_eq_precut(Patch, Value) ->
set(Patch, <<"eqPrecut"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 105).
-spec set_eq_bands(patch(), list(rockbox@types:eq_band_setting())) -> patch().
set_eq_bands(Patch, Value) ->
Encoder = fun(Band) ->
gleam@json:object(
[{<<"cutoff"/utf8>>, gleam@json:int(erlang:element(2, Band))},
{<<"q"/utf8>>, gleam@json:int(erlang:element(3, Band))},
{<<"gain"/utf8>>, gleam@json:int(erlang:element(4, Band))}]
)
end,
set(Patch, <<"eqBandSettings"/utf8>>, gleam@json:array(Value, Encoder)).
-file("src/rockbox/settings.gleam", 116).
-spec set_replaygain(patch(), rockbox@types:replaygain_settings()) -> patch().
set_replaygain(Patch, Value) ->
set(
Patch,
<<"replaygainSettings"/utf8>>,
gleam@json:object(
[{<<"noclip"/utf8>>, gleam@json:bool(erlang:element(2, Value))},
{<<"type"/utf8>>, gleam@json:int(erlang:element(3, Value))},
{<<"preamp"/utf8>>, gleam@json:int(erlang:element(4, Value))}]
)
).
-file("src/rockbox/settings.gleam", 128).
-spec set_compressor(patch(), rockbox@types:compressor_settings()) -> patch().
set_compressor(Patch, Value) ->
set(
Patch,
<<"compressorSettings"/utf8>>,
gleam@json:object(
[{<<"threshold"/utf8>>, gleam@json:int(erlang:element(2, Value))},
{<<"makeupGain"/utf8>>,
gleam@json:int(erlang:element(3, Value))},
{<<"ratio"/utf8>>, gleam@json:int(erlang:element(4, Value))},
{<<"knee"/utf8>>, gleam@json:int(erlang:element(5, Value))},
{<<"releaseTime"/utf8>>,
gleam@json:int(erlang:element(6, Value))},
{<<"attackTime"/utf8>>,
gleam@json:int(erlang:element(7, Value))}]
)
).
-file("src/rockbox/settings.gleam", 143).
-spec set_crossfade_enabled(patch(), integer()) -> patch().
set_crossfade_enabled(Patch, Value) ->
set(Patch, <<"crossfadeEnabled"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 147).
-spec set_crossfade_fade_in_delay(patch(), integer()) -> patch().
set_crossfade_fade_in_delay(Patch, Value) ->
set(Patch, <<"crossfadeFadeInDelay"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 151).
-spec set_crossfade_fade_in_duration(patch(), integer()) -> patch().
set_crossfade_fade_in_duration(Patch, Value) ->
set(Patch, <<"crossfadeFadeInDuration"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 155).
-spec set_crossfade_fade_out_delay(patch(), integer()) -> patch().
set_crossfade_fade_out_delay(Patch, Value) ->
set(Patch, <<"crossfadeFadeOutDelay"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 159).
-spec set_crossfade_fade_out_duration(patch(), integer()) -> patch().
set_crossfade_fade_out_duration(Patch, Value) ->
set(Patch, <<"crossfadeFadeOutDuration"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 163).
-spec set_crossfade_fade_out_mixmode(patch(), integer()) -> patch().
set_crossfade_fade_out_mixmode(Patch, Value) ->
set(Patch, <<"crossfadeFadeOutMixmode"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 167).
-spec set_crossfeed_enabled(patch(), boolean()) -> patch().
set_crossfeed_enabled(Patch, Value) ->
set(Patch, <<"crossfeedEnabled"/utf8>>, gleam@json:bool(Value)).
-file("src/rockbox/settings.gleam", 171).
-spec set_crossfeed_direct_gain(patch(), integer()) -> patch().
set_crossfeed_direct_gain(Patch, Value) ->
set(Patch, <<"crossfeedDirectGain"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 175).
-spec set_crossfeed_cross_gain(patch(), integer()) -> patch().
set_crossfeed_cross_gain(Patch, Value) ->
set(Patch, <<"crossfeedCrossGain"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 179).
-spec set_crossfeed_hf_attenuation(patch(), integer()) -> patch().
set_crossfeed_hf_attenuation(Patch, Value) ->
set(Patch, <<"crossfeedHfAttenuation"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 183).
-spec set_crossfeed_hf_cutoff(patch(), integer()) -> patch().
set_crossfeed_hf_cutoff(Patch, Value) ->
set(Patch, <<"crossfeedHfCutoff"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 187).
-spec set_repeat_mode(patch(), integer()) -> patch().
set_repeat_mode(Patch, Value) ->
set(Patch, <<"repeatMode"/utf8>>, gleam@json:int(Value)).
-file("src/rockbox/settings.gleam", 191).
-spec set_single_mode(patch(), boolean()) -> patch().
set_single_mode(Patch, Value) ->
set(Patch, <<"singleMode"/utf8>>, gleam@json:bool(Value)).
-file("src/rockbox/settings.gleam", 195).
-spec set_party_mode(patch(), boolean()) -> patch().
set_party_mode(Patch, Value) ->
set(Patch, <<"partyMode"/utf8>>, gleam@json:bool(Value)).
-file("src/rockbox/settings.gleam", 199).
-spec set_shuffle(patch(), boolean()) -> patch().
set_shuffle(Patch, Value) ->
set(Patch, <<"shuffle"/utf8>>, gleam@json:bool(Value)).
-file("src/rockbox/settings.gleam", 203).
-spec set_player_name(patch(), binary()) -> patch().
set_player_name(Patch, Value) ->
set(Patch, <<"playerName"/utf8>>, gleam@json:string(Value)).
-file("src/rockbox/settings.gleam", 208).
?DOC(" Push the patch to the daemon.\n").
-spec save(rockbox:client(), patch()) -> {ok, nil} |
{error, rockbox@error:error()}.
save(Client, Patch) ->
Payload = gleam@json:object(lists:reverse(erlang:element(2, Patch))),
rockbox:execute(
Client,
<<"mutation SaveSettings($settings: NewGlobalSettings!) { saveSettings(settings: $settings) }"/utf8>>,
gleam@json:object([{<<"settings"/utf8>>, Payload}])
).