-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}]) ).