diff options
author | lawl <github@dumbinter.net> | 2020-11-12 09:49:32 +0100 |
---|---|---|
committer | lawl <github@dumbinter.net> | 2020-11-12 10:14:05 +0100 |
commit | 6238c208e5d80827ced53eb2d08656143c00e508 (patch) | |
tree | a43ee046858e63ff0f4baa5a63423ae6ae147f81 | |
parent | be9849b7480675bf915b2f50934ec71909922de8 (diff) | |
download | noisetorch-6238c208e5d80827ced53eb2d08656143c00e508.tar.gz noisetorch-6238c208e5d80827ced53eb2d08656143c00e508.zip |
Refactor: uistate -> context
-rw-r--r-- | main.go | 34 | ||||
-rw-r--r-- | module.go | 5 | ||||
-rw-r--r-- | ui.go | 130 | ||||
-rw-r--r-- | update.go | 26 |
4 files changed, 98 insertions, 97 deletions
@@ -73,9 +73,9 @@ func main() { rnnoisefile := dumpLib() defer removeLib(rnnoisefile) - ui := uistate{} - ui.config = readConfig() - ui.librnnoise = rnnoisefile + ctx := ntcontext{} + ctx.config = readConfig() + ctx.librnnoise = rnnoisefile paClient, err := pulseaudio.NewClient() if err != nil { @@ -95,9 +95,9 @@ func main() { if threshold > 0 { if threshold > 95 { fmt.Fprintf(os.Stderr, "Threshold of '%d' too high, setting to maximum of 95.\n", threshold) - ui.config.Threshold = 95 + ctx.config.Threshold = 95 } else { - ui.config.Threshold = threshold + ctx.config.Threshold = threshold } } @@ -120,7 +120,7 @@ func main() { sources := getSources(paClient) for i := range sources { if sources[i].ID == sourceName { - loadSupressor(paClient, sources[i], &ui) + loadSupressor(&ctx, sources[i]) os.Exit(0) } } @@ -130,16 +130,16 @@ func main() { } - if ui.config.EnableUpdates { - go updateCheck(&ui) + if ctx.config.EnableUpdates { + go updateCheck(&ctx) } - go paConnectionWatchdog(&ui) + go paConnectionWatchdog(&ctx) wnd := nucular.NewMasterWindowSize(0, "NoiseTorch", image.Point{550, 300}, func(w *nucular.Window) { - updatefn(w, &ui) + updatefn(&ctx, w) }) - ui.masterWindow = &wnd + ctx.masterWindow = &wnd style := style.FromTheme(style.DarkTheme, 2.0) style.Font = font.DefaultFont(16, 1) wnd.SetStyle(style) @@ -194,9 +194,9 @@ func getSources(client *pulseaudio.Client) []input { return inputs } -func paConnectionWatchdog(ui *uistate) { +func paConnectionWatchdog(ctx *ntcontext) { for { - if ui.paClient.Connected() { + if ctx.paClient.Connected() { time.Sleep(500 * time.Millisecond) continue } @@ -207,12 +207,12 @@ func paConnectionWatchdog(ui *uistate) { fmt.Fprintf(os.Stderr, "Couldn't create pulseaudio client: %v\n", err) } - ui.paClient = paClient - go updateNoiseSupressorLoaded(paClient, &ui.noiseSupressorState) + ctx.paClient = paClient + go updateNoiseSupressorLoaded(paClient, &ctx.noiseSupressorState) - ui.inputList = getSources(paClient) + ctx.inputList = getSources(paClient) - resetUI(ui) + resetUI(ctx) time.Sleep(500 * time.Millisecond) } @@ -63,7 +63,8 @@ func supressorState(c *pulseaudio.Client) int { return unloaded } -func loadSupressor(c *pulseaudio.Client, inp input, ui *uistate) error { +func loadSupressor(ctx *ntcontext, inp input) error { + c := ctx.paClient log.Printf("Querying pulse rlimit\n") @@ -98,7 +99,7 @@ func loadSupressor(c *pulseaudio.Client, inp input, ui *uistate) error { idx, err = c.LoadModule("module-ladspa-sink", fmt.Sprintf("sink_name=nui_mic_raw_in sink_master=nui_mic_denoised_out "+ - "label=noise_suppressor_mono plugin=%s control=%d", ui.librnnoise, ui.config.Threshold)) + "label=noise_suppressor_mono plugin=%s control=%d", ctx.librnnoise, ctx.config.Threshold)) if err != nil { return err } @@ -12,7 +12,7 @@ import ( "github.com/lawl/pulseaudio" ) -type uistate struct { +type ntcontext struct { inputList []input noiseSupressorState int paClient *pulseaudio.Client @@ -33,25 +33,25 @@ var green = color.RGBA{34, 187, 69, 255} var red = color.RGBA{255, 70, 70, 255} var orange = color.RGBA{255, 140, 0, 255} -func updatefn(w *nucular.Window, ui *uistate) { +func updatefn(ctx *ntcontext, w *nucular.Window) { - if !ui.paClient.Connected() { - connectScreen(w, ui) + if !ctx.paClient.Connected() { + connectScreen(ctx, w) return } - if ui.loadingScreen { - loadingScreen(w, ui) + if ctx.loadingScreen { + loadingScreen(ctx, w) return } - if ui.licenseScreen { - licenseScreen(w, ui) + if ctx.licenseScreen { + licenseScreen(ctx, w) return } - if ui.versionScreen { - versionScreen(w, ui) + if ctx.versionScreen { + versionScreen(ctx, w) return } @@ -61,48 +61,48 @@ func updatefn(w *nucular.Window, ui *uistate) { if w := w.Menu(label.TA("About", "LC"), 120, nil); w != nil { w.Row(10).Dynamic(1) if w.MenuItem(label.T("Licenses")) { - ui.licenseScreen = true + ctx.licenseScreen = true } w.Row(10).Dynamic(1) if w.MenuItem(label.T("Source code")) { exec.Command("xdg-open", "https://github.com/lawl/NoiseTorch").Run() } if w.MenuItem(label.T("Version")) { - ui.versionScreen = true + ctx.versionScreen = true } } w.MenubarEnd() w.Row(15).Dynamic(1) - if ui.noiseSupressorState == loaded { + if ctx.noiseSupressorState == loaded { w.LabelColored("NoiseTorch active", "RC", green) - } else if ui.noiseSupressorState == unloaded { + } else if ctx.noiseSupressorState == unloaded { w.LabelColored("NoiseTorch inactive", "RC", red) - } else if ui.noiseSupressorState == inconsistent { + } else if ctx.noiseSupressorState == inconsistent { w.LabelColored("Inconsistent state, please unload first.", "RC", orange) } - if ui.update.available && !ui.update.triggered { + if ctx.update.available && !ctx.update.triggered { w.Row(20).Ratio(0.9, 0.1) - w.LabelColored("Update available! Click to install version: "+ui.update.serverVersion, "LC", green) + w.LabelColored("Update available! Click to install version: "+ctx.update.serverVersion, "LC", green) if w.ButtonText("Update") { - ui.update.triggered = true - go update(ui) - (*ui.masterWindow).Changed() + ctx.update.triggered = true + go update(ctx) + (*ctx.masterWindow).Changed() } } - if ui.update.triggered { + if ctx.update.triggered { w.Row(20).Dynamic(1) - w.Label(ui.update.updatingText, "CC") + w.Label(ctx.update.updatingText, "CC") } if w.TreePush(nucular.TreeTab, "Settings", true) { w.Row(15).Dynamic(2) - if w.CheckboxText("Display Monitor Sources", &ui.config.DisplayMonitorSources) { - ui.sourceListColdWidthIndex++ //recompute the with because of new elements - go writeConfig(ui.config) + if w.CheckboxText("Display Monitor Sources", &ctx.config.DisplayMonitorSources) { + ctx.sourceListColdWidthIndex++ //recompute the with because of new elements + go writeConfig(ctx.config) } w.Spacing(1) @@ -112,13 +112,13 @@ func updatefn(w *nucular.Window, ui *uistate) { if w.Input().Mouse.HoveringRect(w.LastWidgetBounds) { w.Tooltip("If you have a decent microphone, you can usually turn this all the way up.") } - if w.SliderInt(0, &ui.config.Threshold, 95, 1) { - go writeConfig(ui.config) - ui.reloadRequired = true + if w.SliderInt(0, &ctx.config.Threshold, 95, 1) { + go writeConfig(ctx.config) + ctx.reloadRequired = true } - w.Label(fmt.Sprintf("%d%%", ui.config.Threshold), "RC") + w.Label(fmt.Sprintf("%d%%", ctx.config.Threshold), "RC") - if ui.reloadRequired { + if ctx.reloadRequired { w.Row(20).Dynamic(1) w.LabelColored("Reloading NoiseTorch is required to apply these changes.", "LC", orange) } @@ -129,19 +129,19 @@ func updatefn(w *nucular.Window, ui *uistate) { w.Row(15).Dynamic(1) w.Label("Select an input device below:", "LC") - for i := range ui.inputList { - el := &ui.inputList[i] + for i := range ctx.inputList { + el := &ctx.inputList[i] - if el.isMonitor && !ui.config.DisplayMonitorSources { + if el.isMonitor && !ctx.config.DisplayMonitorSources { continue } w.Row(15).Static() w.LayoutFitWidth(0, 0) if w.CheckboxText("", &el.checked) { - ensureOnlyOneInputSelected(&ui.inputList, el) + ensureOnlyOneInputSelected(&ctx.inputList, el) } - w.LayoutFitWidth(ui.sourceListColdWidthIndex, 0) + w.LayoutFitWidth(ctx.sourceListColdWidthIndex, 0) if el.dynamicLatency { w.Label(el.Name, "LC") } else { @@ -153,53 +153,53 @@ func updatefn(w *nucular.Window, ui *uistate) { w.Spacing(1) w.Row(25).Dynamic(2) - if ui.noiseSupressorState != unloaded { + if ctx.noiseSupressorState != unloaded { if w.ButtonText("Unload NoiseTorch") { - ui.loadingScreen = true - ui.reloadRequired = false + ctx.loadingScreen = true + ctx.reloadRequired = false go func() { // don't block the UI thread, just display a working screen so user can't run multiple loads/unloads - if err := unloadSupressor(ui.paClient); err != nil { + if err := unloadSupressor(ctx.paClient); err != nil { log.Println(err) } //wait until PA reports it has actually loaded it, timeout at 10s for i := 0; i < 20; i++ { - if supressorState(ui.paClient) != unloaded { + if supressorState(ctx.paClient) != unloaded { time.Sleep(time.Millisecond * 500) } } - ui.loadingScreen = false - (*ui.masterWindow).Changed() + ctx.loadingScreen = false + (*ctx.masterWindow).Changed() }() } } else { w.Spacing(1) } txt := "Load NoiseTorch" - if ui.noiseSupressorState == loaded { + if ctx.noiseSupressorState == loaded { txt = "Reload NoiseTorch" } - if inp, ok := inputSelection(ui); ok && ui.noiseSupressorState != inconsistent { + if inp, ok := inputSelection(ctx); ok && ctx.noiseSupressorState != inconsistent { if w.ButtonText(txt) { - ui.loadingScreen = true - ui.reloadRequired = false + ctx.loadingScreen = true + ctx.reloadRequired = false go func() { // don't block the UI thread, just display a working screen so user can't run multiple loads/unloads - if ui.noiseSupressorState == loaded { - if err := unloadSupressor(ui.paClient); err != nil { + if ctx.noiseSupressorState == loaded { + if err := unloadSupressor(ctx.paClient); err != nil { log.Println(err) } } - if err := loadSupressor(ui.paClient, inp, ui); err != nil { + if err := loadSupressor(ctx, inp); err != nil { log.Println(err) } //wait until PA reports it has actually loaded it, timeout at 10s for i := 0; i < 20; i++ { - if supressorState(ui.paClient) != loaded { + if supressorState(ctx.paClient) != loaded { time.Sleep(time.Millisecond * 500) } } - ui.loadingScreen = false - (*ui.masterWindow).Changed() + ctx.loadingScreen = false + (*ctx.masterWindow).Changed() }() } } else { @@ -220,8 +220,8 @@ func ensureOnlyOneInputSelected(inps *[]input, current *input) { current.checked = true } -func inputSelection(ui *uistate) (input, bool) { - for _, in := range ui.inputList { +func inputSelection(ctx *ntcontext) (input, bool) { + for _, in := range ctx.inputList { if in.checked { return in, true } @@ -229,16 +229,16 @@ func inputSelection(ui *uistate) (input, bool) { return input{}, false } -func loadingScreen(w *nucular.Window, ui *uistate) { +func loadingScreen(ctx *ntcontext, w *nucular.Window) { w.Row(50).Dynamic(1) w.Label("Working...", "CB") w.Row(50).Dynamic(1) w.Label("(this may take a few seconds)", "CB") } -func licenseScreen(w *nucular.Window, ui *uistate) { +func licenseScreen(ctx *ntcontext, w *nucular.Window) { w.Row(255).Dynamic(1) - field := &ui.licenseTextArea + field := &ctx.licenseTextArea field.Flags |= nucular.EditMultiline if len(field.Buffer) < 1 { field.Buffer = []rune(licenseString) @@ -248,11 +248,11 @@ func licenseScreen(w *nucular.Window, ui *uistate) { w.Row(20).Dynamic(2) w.Spacing(1) if w.ButtonText("OK") { - ui.licenseScreen = false + ctx.licenseScreen = false } } -func versionScreen(w *nucular.Window, ui *uistate) { +func versionScreen(ctx *ntcontext, w *nucular.Window) { w.Row(50).Dynamic(1) w.Label("Version", "CB") w.Row(50).Dynamic(1) @@ -262,19 +262,19 @@ func versionScreen(w *nucular.Window, ui *uistate) { w.Row(20).Dynamic(2) w.Spacing(1) if w.ButtonText("OK") { - ui.versionScreen = false + ctx.versionScreen = false } } -func connectScreen(w *nucular.Window, ui *uistate) { +func connectScreen(ctx *ntcontext, w *nucular.Window) { w.Row(50).Dynamic(1) w.Label("Connecting to pulseaudio...", "CB") } -func resetUI(ui *uistate) { - ui.loadingScreen = false +func resetUI(ctx *ntcontext) { + ctx.loadingScreen = false - if ui.masterWindow != nil { - (*ui.masterWindow).Changed() + if ctx.masterWindow != nil { + (*ctx.masterWindow).Changed() } } @@ -22,7 +22,7 @@ type updateui struct { updatingText string } -func updateCheck(ui *uistate) { +func updateCheck(ctx *ntcontext) { log.Println("Checking for updates") bodybuf, err := fetchFile("version.txt") if err != nil { @@ -31,27 +31,27 @@ func updateCheck(ui *uistate) { } body := strings.TrimSpace(string(bodybuf)) - ui.update.serverVersion = body - if ui.update.serverVersion != version { - ui.update.available = true + ctx.update.serverVersion = body + if ctx.update.serverVersion != version { + ctx.update.available = true } } -func update(ui *uistate) { +func update(ctx *ntcontext) { sig, err := fetchFile("NoiseTorch_x64.tgz.sig") if err != nil { log.Println("Couldn't fetch signature", err) - ui.update.updatingText = "Update failed!" - (*ui.masterWindow).Changed() + ctx.update.updatingText = "Update failed!" + (*ctx.masterWindow).Changed() return } tgz, err := fetchFile("NoiseTorch_x64.tgz") if err != nil { log.Println("Couldn't fetch tgz", err) - ui.update.updatingText = "Update failed!" - (*ui.masterWindow).Changed() + ctx.update.updatingText = "Update failed!" + (*ctx.masterWindow).Changed() return } @@ -61,16 +61,16 @@ func update(ui *uistate) { if !verified { log.Printf("SIGNATURE VERIFICATION FAILED, ABORTING UPDATE!\n") - ui.update.updatingText = "Update failed!" - (*ui.masterWindow).Changed() + ctx.update.updatingText = "Update failed!" + (*ctx.masterWindow).Changed() return } untar(bytes.NewReader(tgz), os.Getenv("HOME")) log.Printf("Update installed!\n") - ui.update.updatingText = "Update installed! (Restart NoiseTorch to apply)" - (*ui.masterWindow).Changed() + ctx.update.updatingText = "Update installed! (Restart NoiseTorch to apply)" + (*ctx.masterWindow).Changed() } func fetchFile(file string) ([]byte, error) { |