Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support AudioRenderer protocol for AudioManager #465

Merged
merged 1 commit into from
Aug 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions Sources/LiveKit/Protocols/AudioCustomProcessingDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,16 @@ public protocol AudioCustomProcessingDelegate {
}

class AudioCustomProcessingDelegateAdapter: NSObject, LKRTCAudioCustomProcessingDelegate {
//
// MARK: - Public

public var target: AudioCustomProcessingDelegate? { _state.target }

// MARK: - Internal

let audioRenderers = MulticastDelegate<AudioRenderer>(label: "AudioRenderer")

// MARK: - Private

private struct State {
weak var target: AudioCustomProcessingDelegate?
}
Expand All @@ -62,7 +69,13 @@ class AudioCustomProcessingDelegateAdapter: NSObject, LKRTCAudioCustomProcessing
}

func audioProcessingProcess(audioBuffer: LKRTCAudioBuffer) {
target?.audioProcessingProcess(audioBuffer: LKAudioBuffer(audioBuffer: audioBuffer))
let lkAudioBuffer = LKAudioBuffer(audioBuffer: audioBuffer)
target?.audioProcessingProcess(audioBuffer: lkAudioBuffer)

// Convert to pcmBuffer and notify only if an audioRenderer is added.
if audioRenderers.isDelegatesNotEmpty, let pcmBuffer = lkAudioBuffer.toAVAudioPCMBuffer() {
audioRenderers.notify { $0.render?(pcmBuffer: pcmBuffer) }
}
}

func audioProcessingRelease() {
Expand Down
7 changes: 6 additions & 1 deletion Sources/LiveKit/Protocols/AudioRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
* limitations under the License.
*/

import AVFoundation
import CoreMedia

#if swift(>=5.9)
Expand All @@ -25,7 +26,11 @@ internal import LiveKitWebRTC
@objc
public protocol AudioRenderer {
/// CMSampleBuffer for this track.
@objc optional
func render(sampleBuffer: CMSampleBuffer)

@objc optional
func render(pcmBuffer: AVAudioPCMBuffer)
}

class AudioRendererAdapter: NSObject, LKRTCAudioRenderer {
Expand All @@ -36,7 +41,7 @@ class AudioRendererAdapter: NSObject, LKRTCAudioRenderer {
}

func render(sampleBuffer: CMSampleBuffer) {
target?.render(sampleBuffer: sampleBuffer)
target?.render?(sampleBuffer: sampleBuffer)
}

// Proxy the equality operators
Expand Down
27 changes: 27 additions & 0 deletions Sources/LiveKit/Track/AudioManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -313,3 +313,30 @@ public class AudioManager: Loggable {
}
#endif
}

public extension AudioManager {
/// Add an ``AudioRenderer`` to receive pcm buffers from local input (mic).
/// Only ``AudioRenderer/render(pcmBuffer:)`` will be called.
/// Usage: `AudioManager.shared.add(localAudioRenderer: localRenderer)`
func add(localAudioRenderer delegate: AudioRenderer) {
capturePostProcessingDelegateAdapter.audioRenderers.add(delegate: delegate)
}

func remove(localAudioRenderer delegate: AudioRenderer) {
capturePostProcessingDelegateAdapter.audioRenderers.remove(delegate: delegate)
}
}

public extension AudioManager {
/// Add an ``AudioRenderer`` to receive pcm buffers from combined remote audio.
/// Only ``AudioRenderer/render(pcmBuffer:)`` will be called.
/// To receive buffer for individual tracks, use ``RemoteAudioTrack/add(audioRenderer:)`` instead.
/// Usage: `AudioManager.shared.add(remoteAudioRenderer: localRenderer)`
func add(remoteAudioRenderer delegate: AudioRenderer) {
renderPreProcessingDelegateAdapter.audioRenderers.add(delegate: delegate)
}

func remove(remoteAudioRenderer delegate: AudioRenderer) {
renderPreProcessingDelegateAdapter.audioRenderers.remove(delegate: delegate)
}
}
2 changes: 1 addition & 1 deletion Sources/LiveKit/Track/Remote/RemoteAudioTrack.swift
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public class RemoteAudioTrack: Track, RemoteTrack, AudioTrack {
extension RemoteAudioTrack: AudioRenderer {
public func render(sampleBuffer: CMSampleBuffer) {
_rendererState.audioRenderers.notify { audioRenderer in
audioRenderer.render(sampleBuffer: sampleBuffer)
audioRenderer.render?(sampleBuffer: sampleBuffer)
}
}
}
Loading