Conversation
There was a problem hiding this comment.
Cpp-linter Review
Used clang-format v21.1.8
Click here for the full clang-format patch
diff --git a/Sources/CSFBAudioEngine/Player/AudioPlayer.mm b/Sources/CSFBAudioEngine/Player/AudioPlayer.mm
index f7251b3..132bd8e 100644
--- a/Sources/CSFBAudioEngine/Player/AudioPlayer.mm
+++ b/Sources/CSFBAudioEngine/Player/AudioPlayer.mm
@@ -2107,2 +2107,2 @@ void sfb::AudioPlayer::handleRenderingWillCompleteEvent(Decoder decoder, uint64_
- if (didStopEngine &&
- [player.delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) {
+ if (didStopEngine && [player.delegate respondsToSelector:@selector(audioPlayer:
+ playbackStateChanged:)]) {
Have any feedback or feature suggestions? Share it here.
| if (didStopEngine && | ||
| [player.delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) { |
There was a problem hiding this comment.
clang-format suggestion
| if (didStopEngine && | |
| [player.delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) { | |
| if (didStopEngine && [player.delegate respondsToSelector:@selector(audioPlayer: | |
| playbackStateChanged:)]) { |
There was a problem hiding this comment.
Pull request overview
This PR reduces the risk of use-after-free during the “rendering complete” async notification path by ensuring delegate callbacks use the block’s strongly-retained SFBAudioPlayer *player rather than the AudioPlayer’s weak player_ back-pointer.
Changes:
- Use the strong local
playerreference (promoted fromweakPlayer) forplaybackStateChanged:delegate notifications in the rendering-complete dispatch block. - Minor formatting cleanup of the
@selector(audioPlayer:playbackStateChanged:)check.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Cpp-linter Review
Used clang-format v21.1.8
Click here for the full clang-format patch
diff --git a/Sources/CSFBAudioEngine/Player/AudioPlayer.mm b/Sources/CSFBAudioEngine/Player/AudioPlayer.mm
index 2e3b3c5..132bd8e 100644
--- a/Sources/CSFBAudioEngine/Player/AudioPlayer.mm
+++ b/Sources/CSFBAudioEngine/Player/AudioPlayer.mm
@@ -667,2 +667,2 @@ bool sfb::AudioPlayer::play(NSError **error) noexcept {
- if ((didStartEngine || !wasPlaying) &&
- [player_.delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) {
+ if ((didStartEngine || !wasPlaying) && [player_.delegate respondsToSelector:@selector(audioPlayer:
+ playbackStateChanged:)]) {
@@ -1786,2 +1786,2 @@ bool sfb::AudioPlayer::processDecoderCanceledEvent() noexcept {
- } else if (error != nil &&
- [player_.delegate respondsToSelector:@selector(audioPlayer:decodingAborted:error:framesRendered:)]) {
+ } else if (error != nil && [player_.delegate respondsToSelector:@selector(audioPlayer:
+ decodingAborted:error:framesRendered:)]) {
@@ -2107,2 +2107,2 @@ void sfb::AudioPlayer::handleRenderingWillCompleteEvent(Decoder decoder, uint64_
- if (didStopEngine &&
- [player.delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) {
+ if (didStopEngine && [player.delegate respondsToSelector:@selector(audioPlayer:
+ playbackStateChanged:)]) {
@@ -2247,2 +2247,2 @@ void sfb::AudioPlayer::handleAudioSessionInterruption(NSDictionary *userInfo) no
- if (preInterruptState_ != 0 &&
- [player_.delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) {
+ if (preInterruptState_ != 0 && [player_.delegate respondsToSelector:@selector(audioPlayer:
+ playbackStateChanged:)]) {
Have any feedback or feature suggestions? Share it here.
| if ((didStartEngine || !wasPlaying) && | ||
| [player_.delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) { |
There was a problem hiding this comment.
clang-format suggestion
| if ((didStartEngine || !wasPlaying) && | |
| [player_.delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) { | |
| if ((didStartEngine || !wasPlaying) && [player_.delegate respondsToSelector:@selector(audioPlayer: | |
| playbackStateChanged:)]) { |
| } else if (error != nil && | ||
| [player_.delegate respondsToSelector:@selector(audioPlayer:decodingAborted:error:framesRendered:)]) { |
There was a problem hiding this comment.
clang-format suggestion
| } else if (error != nil && | |
| [player_.delegate respondsToSelector:@selector(audioPlayer:decodingAborted:error:framesRendered:)]) { | |
| } else if (error != nil && [player_.delegate respondsToSelector:@selector(audioPlayer: | |
| decodingAborted:error:framesRendered:)]) { |
| if (didStopEngine && | ||
| [player.delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) { |
There was a problem hiding this comment.
clang-format suggestion
| if (didStopEngine && | |
| [player.delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) { | |
| if (didStopEngine && [player.delegate respondsToSelector:@selector(audioPlayer: | |
| playbackStateChanged:)]) { |
| if (preInterruptState_ != 0 && | ||
| [player_.delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) { |
There was a problem hiding this comment.
clang-format suggestion
| if (preInterruptState_ != 0 && | |
| [player_.delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) { | |
| if (preInterruptState_ != 0 && [player_.delegate respondsToSelector:@selector(audioPlayer: | |
| playbackStateChanged:)]) { |
No description provided.