Lazy initialize singleton mixer node (#58)

This commit is contained in:
junyaninflection
2023-08-14 19:22:24 +03:00
committed by GitHub
parent 0f2a1f7b8a
commit 6f552e60c0
2 changed files with 13 additions and 7 deletions
@@ -108,7 +108,7 @@ open class AudioPlayer {
private var stateBeforePaused: InternalState = .initial
/// The underlying `AVAudioEngine` object
private let audioEngine = AVAudioEngine()
private let audioEngine: AVAudioEngine
/// An `AVAudioUnit` object that represents the audio player
private(set) var player = AVAudioUnit()
/// An `AVAudioUnitTimePitch` that controls the playback rate of the audio engine
@@ -134,7 +134,8 @@ open class AudioPlayer {
public init(configuration: AudioPlayerConfiguration = .default) {
self.configuration = configuration.normalizeValues()
let engine = AVAudioEngine()
self.audioEngine = engine
rendererContext = AudioRendererContext(configuration: configuration, outputAudioFormat: outputAudioFormat)
playerContext = AudioPlayerContext()
entriesQueue = PlayerQueueEntries()
@@ -150,12 +151,14 @@ open class AudioPlayer {
rendererContext: rendererContext,
outputAudioFormat: outputAudioFormat.basicStreamDescription)
frameFilterProcessor = FrameFilterProcessor(mixerNode: audioEngine.mainMixerNode)
playerRenderProcessor = AudioPlayerRenderProcessor(playerContext: playerContext,
rendererContext: rendererContext,
outputAudioFormat: outputAudioFormat.basicStreamDescription)
frameFilterProcessor = FrameFilterProcessor(mixerNodeProvider: {
engine.mainMixerNode
})
configPlayerContext()
configPlayerNode()
setupEngine()
@@ -78,14 +78,17 @@ final class FrameFilterProcessor: NSObject, FrameFiltering {
}
private let lock = UnfairLock()
private let mixerNode: AVAudioMixerNode
private let mixerNodeProvider: (() -> AVAudioMixerNode)
private lazy var mixerNode: AVAudioMixerNode = {
return mixerNodeProvider()
}()
private(set) var entries: [FilterEntry] = []
private var hasInstalledTap: Bool = false
init(mixerNode: AVAudioMixerNode) {
self.mixerNode = mixerNode
init(mixerNodeProvider: @escaping (() -> AVAudioMixerNode)) {
self.mixerNodeProvider = mixerNodeProvider
}
public func add(entry: FilterEntry) {