Skip to content

Commit

Permalink
ParameterEditor cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
wtholliday committed Aug 4, 2022
1 parent 876bce4 commit 7ae193a
Showing 1 changed file with 27 additions and 25 deletions.
52 changes: 27 additions & 25 deletions Sources/AudioKitUI/Controls/ParameterEditor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,43 @@

import SwiftUI
import AudioKit
import AudioUnit

/// Hack to get SwiftUI to poll and refresh our UI.
class Refresher: ObservableObject {
@Published var version = 0
var param: NodeParameter?
private var previousValue: AUValue = 0.0
private var timer = Timer()
class ParameterEditorModel: ObservableObject {

init() {
timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { [weak self] _ in
guard let self = self else { return }
guard let param = self.param else { return }
let value = param.value
if value != self.previousValue {
self.version += 1
self.previousValue = value
@Published var value: AUValue = 0 {
didSet {
if let param = self.param {
param.value = value
}
})
}
}

var paramToken: AUParameterObserverToken?

var param: NodeParameter? {
didSet {
guard let param = param else { return }
value = param.value
paramToken = param.parameter.token { [weak self] _, newValue in
DispatchQueue.main.async {
self?.value = newValue
}
}
}
}
}

public struct ParameterEditor: View {
var param: NodeParameter
@StateObject var refresher = Refresher()
@StateObject var model = ParameterEditorModel()

public init(param: NodeParameter) {
self.param = param
}

func getBinding() -> Binding<Float> {
Binding(get: { param.value }, set: { param.value = $0; refresher.version += 1; })
}

func getIntBinding() -> Binding<Int> {
Binding(get: { Int(param.value) }, set: { param.value = AUValue($0); refresher.version += 1; })
Binding(get: { Int(model.value) }, set: { model.value = AUValue($0) })
}

func intValues() -> Array<Int> {
Expand All @@ -50,7 +52,7 @@ public struct ParameterEditor: View {
switch param.def.unit {
case .boolean:
Toggle(isOn: Binding(get: { param.value == 1.0 }, set: {
param.value = $0 ? 1.0 : 0.0; refresher.version += 1;
param.value = $0 ? 1.0 : 0.0
}), label: { Text(param.def.name) })
case .indexed:
if param.range.upperBound - param.range.lowerBound < 5 {
Expand All @@ -61,22 +63,22 @@ public struct ParameterEditor: View {
}
.pickerStyle(.segmented)
} else {
Slider(value: getBinding(),
Slider(value: $model.value,
in: param.range,
step: 1.0,
label: { Text(param.def.name).frame(width: 200, alignment: .leading) },
minimumValueLabel: { Text(String(format: "%.0f", param.range.lowerBound)) },
maximumValueLabel: { Text(String(format: "%.0f", param.range.upperBound)) } )
}
default:
Slider(value: getBinding(),
Slider(value: $model.value,
in: param.range,
label: { Text(param.def.name).frame(width: 200, alignment: .leading) },
minimumValueLabel: { Text(String(format: "%.2f", param.range.lowerBound)) },
maximumValueLabel: { Text(String(format: "%.2f", param.range.upperBound)) })
}
}.onAppear {
refresher.param = param
model.param = param
}
}
}

0 comments on commit 7ae193a

Please sign in to comment.