Skip to content

Commit

Permalink
Fixed crashes
Browse files Browse the repository at this point in the history
  • Loading branch information
bradhowes committed Nov 29, 2024
1 parent 53d1d4f commit 9c68ede
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 94 deletions.
4 changes: 2 additions & 2 deletions Configuration/Common.xcconfig
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ AU_COMPONENT_MANUFACTURER = BRay
AU_FACTORY_FUNCTION = SimplyLowPassAU.ViewController

// The "build" version -- the `bumpVersions.py -b` option sets this to a date/time stamp
CURRENT_PROJECT_VERSION = 202411032203898
CURRENT_PROJECT_VERSION = 202411292203899

// The visible version (eg. 1.2.3)
MARKETING_VERSION = 5.0.0
MARKETING_VERSION = 5.0.1

// Copyright notice to put in the Info.plist files
COPYRIGHT_NOTICE = Copyright © 2024 B-Ray Software
Expand Down
6 changes: 3 additions & 3 deletions Packages/Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version:5.9
// swift-tools-version:6.0

import PackageDescription

Expand All @@ -14,8 +14,8 @@ let package = Package(
.library(name: "UI", targets: ["UI"])
],
dependencies: [
.package(url: "https://github.com/bradhowes/AUv3Support", exact: "15.0.2"),
// .package(path: "/Users/howes/src/Mine/AUv3Support")
// .package(url: "https://github.com/bradhowes/AUv3Support", exact: "16.0.0"),
.package(path: "/Users/howes/src/Mine/AUv3Support")
],
targets: [
.target(
Expand Down
87 changes: 45 additions & 42 deletions Packages/Sources/UI/FilterView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public struct FilterViewRanges {
Delegation protocol for the FilterView. Reports out touch/mouse events and changes to the runtime
parameters.
*/
@MainActor
public protocol FilterViewDelegate: AnyObject {

/// Defines the coordinate spaces for the view in AUParameter units.
Expand Down Expand Up @@ -161,52 +162,54 @@ public final class FilterView: View {
}

override public func awakeFromNib() {
os_log(.debug, log: log, "awakeFromNib BEGIN")

MainActor.assumeIsolated {
os_log(.debug, log: log, "awakeFromNib BEGIN")

#if os(macOS)
self.wantsLayer = true
self.wantsLayer = true
#endif

super.awakeFromNib()

rootLayer.masksToBounds = false
rootLayer.contentsScale = screenScale

plotLayer.name = "plot"
plotLayer.anchorPoint = .zero
plotLayer.bounds = CGRect(origin: .zero, size: rootLayer.bounds.size)
plotLayer.contentsScale = screenScale
rootLayer.addSublayer(plotLayer)

graphLayer.name = "graph"
graphLayer.backgroundColor = Color.black.cgColor
graphLayer.position = CGPoint(x: yAxisWidth, y: 0.0)
graphLayer.anchorPoint = .zero
graphLayer.contentsScale = screenScale
plotLayer.addSublayer(graphLayer)

gridLayer.name = "grid"
gridLayer.position = .zero
gridLayer.anchorPoint = .zero
graphLayer.addSublayer(gridLayer)

curveLayer.name = "curve"
curveLayer.anchorPoint = .zero
curveLayer.position = .zero
graphLayer.addSublayer(curveLayer)

indicatorLayer.name = "indicator"
indicatorLayer.position = .zero
indicatorLayer.anchorPoint = .zero
graphLayer.addSublayer(indicatorLayer)

createIndicatorPoint()

super.awakeFromNib()
rootLayer.masksToBounds = false
rootLayer.contentsScale = screenScale
plotLayer.name = "plot"
plotLayer.anchorPoint = .zero
plotLayer.bounds = CGRect(origin: .zero, size: rootLayer.bounds.size)
plotLayer.contentsScale = screenScale
rootLayer.addSublayer(plotLayer)
graphLayer.name = "graph"
graphLayer.backgroundColor = Color.black.cgColor
graphLayer.position = CGPoint(x: yAxisWidth, y: 0.0)
graphLayer.anchorPoint = .zero
graphLayer.contentsScale = screenScale
plotLayer.addSublayer(graphLayer)
gridLayer.name = "grid"
gridLayer.position = .zero
gridLayer.anchorPoint = .zero
graphLayer.addSublayer(gridLayer)
curveLayer.name = "curve"
curveLayer.anchorPoint = .zero
curveLayer.position = .zero
graphLayer.addSublayer(curveLayer)
indicatorLayer.name = "indicator"
indicatorLayer.position = .zero
indicatorLayer.anchorPoint = .zero
graphLayer.addSublayer(indicatorLayer)
createIndicatorPoint()
#if os(macOS)
layoutSublayers(of: rootLayer)
layoutSublayers(of: rootLayer)
#endif

os_log(.debug, log: log, "awakeFromNib END")

os_log(.debug, log: log, "awakeFromNib END")
}
}

#if os(iOS)
Expand Down
61 changes: 36 additions & 25 deletions Packages/Sources/UI/FilterViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,17 @@ import os.log
// NOTE: this special form sets the subsystem name and must run before any other logger calls.
private let log = Shared.logger(Bundle.main.auBaseName + "AU", "ViewController")

private var filterView: FilterView!
public let kernelBridge = KernelBridge(Bundle.main.auBaseName + "AU")
private let parameters = Parameters()

private var filterView: FilterView!

private var viewConfig: AUAudioUnitViewConfiguration!

private var cutoffObserverToken: AUParameterObserverToken?
private var resonanceObserverToken: AUParameterObserverToken?
private var currentPresetObserverToken: NSKeyValueObservation?

public var kernelBridge: KernelBridge?
public var audioUnit: FilterAudioUnit? {
didSet {
DispatchQueue.main.async {
Expand Down Expand Up @@ -105,45 +106,55 @@ extension FilterViewController: AudioUnitViewConfigurationManager {}
// MARK: - AUAudioUnitFactory

extension FilterViewController: AUAudioUnitFactory {
@objc public func createAudioUnit(with componentDescription: AudioComponentDescription) throws -> AUAudioUnit {
let kernelBridge = KernelBridge(Bundle.main.auBaseName + "AU")
self.kernelBridge = kernelBridge
let audioUnit = try FilterAudioUnitFactory.create(componentDescription: componentDescription,
parameters: parameters, kernel: kernelBridge,
viewConfigurationManager: self)
self.audioUnit = audioUnit

currentPresetObserverToken = audioUnit.observe(\.currentPreset, options: []) { object, change in
os_log(.error, log: self.log, "currentPreset changed")
DispatchQueue.main.async {
self.updateDisplay()
}
}

// Uff. What a mess to get right. AUv3 infrastructure will invoke on a thread that is probably *not* the main
// thread. Be sure to create the audio unit on the main thread and then pass it out. No idea what is actually
// done with it.
nonisolated public func createAudioUnit(with componentDescription: AudioComponentDescription) throws -> AUAudioUnit {
let audioUnit = try DispatchQueue.main.sync {
let audioUnit = try FilterAudioUnitFactory.create(componentDescription: componentDescription,
viewConfigurationManager: self)
self.audioUnit = audioUnit
return audioUnit
}
return audioUnit
}
}


// MARK: - Private

extension FilterViewController {

private func connectViewToAU() {
os_log(.info, log: log, "connectViewToAU")

cutoffObserverToken = parameters.cutoff.token(byAddingParameterObserver: { [weak self] address, value in
guard let self = self else { return }
DispatchQueue.main.async { self.updateDisplay() }
})
audioUnit?.configure(parameters: parameters, kernel: kernelBridge)

resonanceObserverToken = parameters.resonance.token(byAddingParameterObserver: { [weak self] address, value in
guard let self = self else { return }
DispatchQueue.main.async { self.updateDisplay() }
})
cutoffObserverToken = parameters.cutoff.token(byAddingParameterObserver: parameterChanged(address:value:))
resonanceObserverToken = parameters.resonance.token(byAddingParameterObserver: parameterChanged(address:value:))
currentPresetObserverToken = audioUnit?.observe(
\.currentPreset,
options: [],
changeHandler: currentPresetChanged(object:change:)
)

updateDisplay()
}

nonisolated private func parameterChanged(address: AUParameterAddress, value: AUValue) {
DispatchQueue.main.async { [weak self] in
self?.updateDisplay()
}
}

nonisolated private func currentPresetChanged(object: FilterAudioUnit,
change: NSKeyValueObservedChange<Optional<AUAudioUnitPreset>>) {
DispatchQueue.main.async { [weak self] in
self?.updateDisplay()
}
}

private func updateDisplay() {
os_log(.info, log: log, "updateDisplay BEGIN - cutoff: %f resonance: %f", parameters.cutoff.value,
parameters.resonance.value)
Expand All @@ -161,7 +172,7 @@ extension FilterViewController {
os_log(.info, log: log, "magnitudes BEGIN - cutoff: %f resonance: %f", parameters.cutoff.value,
parameters.resonance.value)
var output: [Float] = Array(repeating: 0.0, count: frequencies.count)
kernelBridge?.magnitudes(frequencies, count: frequencies.count, output: &output)
kernelBridge.magnitudes(frequencies, count: frequencies.count, output: &output)
return output
}
}
Loading

0 comments on commit 9c68ede

Please sign in to comment.