diff --git a/AudioStreaming/Streaming/AudioPlayer/AudioPlayer.swift b/AudioStreaming/Streaming/AudioPlayer/AudioPlayer.swift index ecb0322..023e70e 100644 --- a/AudioStreaming/Streaming/AudioPlayer/AudioPlayer.swift +++ b/AudioStreaming/Streaming/AudioPlayer/AudioPlayer.swift @@ -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() diff --git a/AudioStreaming/Streaming/AudioPlayer/Processors/FrameFilterProcessor.swift b/AudioStreaming/Streaming/AudioPlayer/Processors/FrameFilterProcessor.swift index 8f2d7df..38dc3b9 100644 --- a/AudioStreaming/Streaming/AudioPlayer/Processors/FrameFilterProcessor.swift +++ b/AudioStreaming/Streaming/AudioPlayer/Processors/FrameFilterProcessor.swift @@ -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) {