From adbe863462cb5809a3fd6940496c01dbdc54679e Mon Sep 17 00:00:00 2001 From: maciejmakowski2003 Date: Thu, 12 Mar 2026 14:12:52 +0100 Subject: [PATCH 1/2] refactor: clean up buffer source nodes classes --- .../AudioBufferBaseSourceNodeHostObject.cpp | 11 ++-- .../AudioBufferSourceNodeHostObject.cpp | 13 +--- .../sources/AudioBufferBaseSourceNode.cpp | 51 ++++++++++------ .../core/sources/AudioBufferBaseSourceNode.h | 59 ++++++++++--------- .../sources/AudioBufferQueueSourceNode.cpp | 26 ++------ .../core/sources/AudioBufferQueueSourceNode.h | 30 +++++----- .../core/sources/AudioBufferSourceNode.cpp | 27 ++------- .../core/sources/AudioBufferSourceNode.h | 30 +++++----- .../common/cpp/audioapi/types/NodeOptions.h | 1 + 9 files changed, 112 insertions(+), 136 deletions(-) diff --git a/packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp b/packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp index 7f3d33102..0be7026d1 100644 --- a/packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +++ b/packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp @@ -13,11 +13,10 @@ namespace audioapi { AudioBufferBaseSourceNodeHostObject::AudioBufferBaseSourceNodeHostObject( const std::shared_ptr &node, const BaseAudioBufferSourceOptions &options) - : AudioScheduledSourceNodeHostObject(node, options), pitchCorrection_(options.pitchCorrection) { + : AudioScheduledSourceNodeHostObject(node, options), onPositionChangedInterval_(options.onPositionChangedInterval), pitchCorrection_(options.pitchCorrection) { auto sourceNode = std::static_pointer_cast(node_); detuneParam_ = std::make_shared(sourceNode->getDetuneParam()); playbackRateParam_ = std::make_shared(sourceNode->getPlaybackRateParam()); - onPositionChangedInterval_ = sourceNode->getOnPositionChangedInterval(); addGetters( JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, detune), @@ -61,7 +60,6 @@ JSI_PROPERTY_SETTER_IMPL(AudioBufferBaseSourceNodeHostObject, onPositionChangedI auto sourceNode = std::static_pointer_cast(node_); auto interval = static_cast(value.getNumber()); - sourceNode->setOnPositionChangedInterval(static_cast(value.getNumber())); auto event = [sourceNode, interval](BaseAudioContext &) { sourceNode->setOnPositionChangedInterval(interval); }; @@ -99,8 +97,11 @@ void AudioBufferBaseSourceNodeHostObject::initStretch(int channelCount, float sa outputLatency_ = std::max( dsp::sampleFrameToTime(stretch->outputLatency(), node_->getContextSampleRate()), 0.0); - auto event = [sourceNode, stretch](BaseAudioContext &) { - sourceNode->initStretch(stretch); + auto playbackRateBuffer = + std::make_shared(3 * RENDER_QUANTUM_SIZE, channelCount, sampleRate); + + auto event = [sourceNode, stretch, playbackRateBuffer](BaseAudioContext &) { + sourceNode->initStretch(stretch, playbackRateBuffer); }; sourceNode->scheduleAudioEvent(std::move(event)); } diff --git a/packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp b/packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp index 003e96d77..9a9bf10a4 100644 --- a/packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +++ b/packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp @@ -169,12 +169,10 @@ void AudioBufferSourceNodeHostObject::setBuffer(const std::shared_ptr(node_); std::shared_ptr copiedBuffer; - std::shared_ptr playbackRateBuffer; std::shared_ptr audioBuffer; if (buffer == nullptr) { copiedBuffer = nullptr; - playbackRateBuffer = nullptr; audioBuffer = std::make_shared( RENDER_QUANTUM_SIZE, 1, audioBufferSourceNode->getContextSampleRate()); } else { @@ -191,20 +189,15 @@ void AudioBufferSourceNodeHostObject::setBuffer(const std::shared_ptr(*buffer); } - playbackRateBuffer = std::make_shared( - 3 * RENDER_QUANTUM_SIZE, - copiedBuffer->getNumberOfChannels(), - audioBufferSourceNode->getContextSampleRate()); audioBuffer = std::make_shared( RENDER_QUANTUM_SIZE, copiedBuffer->getNumberOfChannels(), audioBufferSourceNode->getContextSampleRate()); } - auto event = - [audioBufferSourceNode, copiedBuffer, playbackRateBuffer, audioBuffer](BaseAudioContext &) { - audioBufferSourceNode->setBuffer(copiedBuffer, playbackRateBuffer, audioBuffer); - }; + auto event = [audioBufferSourceNode, copiedBuffer, audioBuffer](BaseAudioContext &) { + audioBufferSourceNode->setBuffer(copiedBuffer, audioBuffer); + }; audioBufferSourceNode->scheduleAudioEvent(std::move(event)); } diff --git a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp index 3da3480d4..14ee814f5 100644 --- a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +++ b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp @@ -16,12 +16,8 @@ AudioBufferBaseSourceNode::AudioBufferBaseSourceNode( const std::shared_ptr &context, const BaseAudioBufferSourceOptions &options) : AudioScheduledSourceNode(context, options), + vReadIndex_(0.0), pitchCorrection_(options.pitchCorrection), - playbackRateBuffer_( // TODO refactor init - std::make_shared( - RENDER_QUANTUM_SIZE * 3, - channelCount_, - context->getSampleRate())), detuneParam_( std::make_shared( options.detune, @@ -33,13 +29,15 @@ AudioBufferBaseSourceNode::AudioBufferBaseSourceNode( options.playbackRate, MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT, - context)), - vReadIndex_(0.0), - onPositionChangedInterval_(static_cast(context->getSampleRate() * 0.1)) {} + context)) { + setOnPositionChangedInterval(options.onPositionChangedInterval); +} void AudioBufferBaseSourceNode::initStretch( - const std::shared_ptr> &stretch) { + const std::shared_ptr> &stretch, + const std::shared_ptr &playbackRateBuffer) { stretch_ = stretch; + playbackRateBuffer_ = playbackRateBuffer; } std::shared_ptr AudioBufferBaseSourceNode::getDetuneParam() const { @@ -55,29 +53,44 @@ void AudioBufferBaseSourceNode::setOnPositionChangedCallbackId(uint64_t callback } void AudioBufferBaseSourceNode::setOnPositionChangedInterval(int interval) { - onPositionChangedInterval_ = + onPositionChangedIntervalInFrames_ = static_cast(getContextSampleRate() * static_cast(interval) / 1000); } -int AudioBufferBaseSourceNode::getOnPositionChangedInterval() const { - return onPositionChangedInterval_; -} - void AudioBufferBaseSourceNode::unregisterOnPositionChangedCallback(uint64_t callbackId) { audioEventHandlerRegistry_->unregisterHandler(AudioEvent::POSITION_CHANGED, callbackId); } +std::shared_ptr AudioBufferBaseSourceNode::processNode( + const std::shared_ptr &processingBuffer, + int framesToProcess) { + if (isEmpty()) { + processingBuffer->zero(); + return processingBuffer; + } + + if (!pitchCorrection_) { + processWithoutPitchCorrection(processingBuffer, framesToProcess); + } else { + processWithPitchCorrection(processingBuffer, framesToProcess); + } + + handleStopScheduled(); + + return processingBuffer; +} + void AudioBufferBaseSourceNode::sendOnPositionChangedEvent() { - if (onPositionChangedCallbackId_ != 0 && onPositionChangedTime_ > onPositionChangedInterval_) { + if (onPositionChangedCallbackId_ != 0 && onPositionChangedTimeInFrames_ > onPositionChangedIntervalInFrames_) { std::unordered_map body = {{"value", getCurrentPosition()}}; audioEventHandlerRegistry_->invokeHandlerWithEventBody( AudioEvent::POSITION_CHANGED, onPositionChangedCallbackId_, body); - onPositionChangedTime_ = 0; + onPositionChangedTimeInFrames_ = 0; } - onPositionChangedTime_ += RENDER_QUANTUM_SIZE; + onPositionChangedTimeInFrames_ += RENDER_QUANTUM_SIZE; } void AudioBufferBaseSourceNode::processWithPitchCorrection( @@ -87,7 +100,7 @@ void AudioBufferBaseSourceNode::processWithPitchCorrection( size_t offsetLength = 0; std::shared_ptr context = context_.lock(); - if (context == nullptr) { + if (context == nullptr || playbackRateBuffer_ == nullptr) { processingBuffer->zero(); return; } @@ -140,8 +153,10 @@ void AudioBufferBaseSourceNode::processWithoutPitchCorrection( processingBuffer->zero(); return; } + auto computedPlaybackRate = getComputedPlaybackRateValue(framesToProcess, context->getCurrentTime()); + updatePlaybackInfo( processingBuffer, framesToProcess, diff --git a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h index 2898750a4..621c44e5c 100644 --- a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +++ b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h @@ -17,8 +17,10 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode { const std::shared_ptr &context, const BaseAudioBufferSourceOptions &options); - /// @note JS Thread only - void initStretch(const std::shared_ptr> &stretch); + /// @note Audio Thread only + void initStretch( + const std::shared_ptr> &stretch, + const std::shared_ptr &playbackRateBuffer); [[nodiscard]] std::shared_ptr getDetuneParam() const; [[nodiscard]] std::shared_ptr getPlaybackRateParam() const; @@ -29,16 +31,36 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode { /// @note Audio Thread only void setOnPositionChangedInterval(int interval); - /// TODO remove and refactor - [[nodiscard]] int getOnPositionChangedInterval() const; - void unregisterOnPositionChangedCallback(uint64_t callbackId); protected: - // pitch correction - const bool pitchCorrection_; + // internal helper + double vReadIndex_; + + std::shared_ptr processNode( + const std::shared_ptr &processingBuffer, + int framesToProcess) final; + + virtual double getCurrentPosition() const = 0; + + virtual bool isEmpty() const = 0; + + virtual void processWithoutInterpolation( + const std::shared_ptr &processingBuffer, + size_t startOffset, + size_t offsetLength, + float playbackRate) = 0; + + virtual void processWithInterpolation( + const std::shared_ptr &processingBuffer, + size_t startOffset, + size_t offsetLength, + float playbackRate) = 0; - // pitch correction + private: + // pitch correction parameters + // late init to avoid unnecessary allocation when pitch correction is not used. + const bool pitchCorrection_; std::shared_ptr> stretch_; std::shared_ptr playbackRateBuffer_; @@ -46,14 +68,9 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode { const std::shared_ptr detuneParam_; const std::shared_ptr playbackRateParam_; - // internal helper - double vReadIndex_; - uint64_t onPositionChangedCallbackId_ = 0; // 0 means no callback - int onPositionChangedInterval_; - int onPositionChangedTime_ = 0; - - virtual double getCurrentPosition() const = 0; + int onPositionChangedIntervalInFrames_; + int onPositionChangedTimeInFrames_ = 0; void sendOnPositionChangedEvent(); @@ -65,18 +82,6 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode { int framesToProcess); float getComputedPlaybackRateValue(int framesToProcess, double time); - - virtual void processWithoutInterpolation( - const std::shared_ptr &processingBuffer, - size_t startOffset, - size_t offsetLength, - float playbackRate) = 0; - - virtual void processWithInterpolation( - const std::shared_ptr &processingBuffer, - size_t startOffset, - size_t offsetLength, - float playbackRate) = 0; }; } // namespace audioapi diff --git a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp index 05abf41c5..bf51342a0 100644 --- a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +++ b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp @@ -132,26 +132,6 @@ void AudioBufferQueueSourceNode::unregisterOnBufferEndedCallback(uint64_t callba audioEventHandlerRegistry_->unregisterHandler(AudioEvent::BUFFER_ENDED, callbackId); } -std::shared_ptr AudioBufferQueueSourceNode::processNode( - const std::shared_ptr &processingBuffer, - int framesToProcess) { - // no audio data to fill, zero the output and return. - if (buffers_.empty()) { - processingBuffer->zero(); - return processingBuffer; - } - - if (!pitchCorrection_) { - processWithoutPitchCorrection(processingBuffer, framesToProcess); - } else { - processWithPitchCorrection(processingBuffer, framesToProcess); - } - - handleStopScheduled(); - - return processingBuffer; -} - double AudioBufferQueueSourceNode::getCurrentPosition() const { return dsp::sampleFrameToTime(static_cast(vReadIndex_), getContextSampleRate()) + playedBuffersDuration_; @@ -171,6 +151,10 @@ void AudioBufferQueueSourceNode::sendOnBufferEndedEvent(size_t bufferId, bool is * Helper functions */ +bool AudioBufferQueueSourceNode::isEmpty() const { + return buffers_.empty(); +} + void AudioBufferQueueSourceNode::processWithoutInterpolation( const std::shared_ptr &processingBuffer, size_t startOffset, @@ -302,8 +286,8 @@ void AudioBufferQueueSourceNode::processWithInterpolation( break; } - context->getGraphManager()->addAudioBufferForDestruction(std::move(buffer)); vReadIndex_ = vReadIndex_ - buffer->getSize(); + context->getGraphManager()->addAudioBufferForDestruction(std::move(buffer)); data = buffers_.front(); bufferId = data.first; buffer = data.second; diff --git a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h index be0ade515..5516cee6f 100644 --- a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +++ b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h @@ -48,14 +48,24 @@ class AudioBufferQueueSourceNode : public AudioBufferBaseSourceNode { void unregisterOnBufferEndedCallback(uint64_t callbackId); protected: - std::shared_ptr processNode( - const std::shared_ptr &processingBuffer, - int framesToProcess) override; - double getCurrentPosition() const override; void sendOnBufferEndedEvent(size_t bufferId, bool isLastBufferInQueue); + bool isEmpty() const final; + + void processWithoutInterpolation( + const std::shared_ptr &processingBuffer, + size_t startOffset, + size_t offsetLength, + float playbackRate) final; + + void processWithInterpolation( + const std::shared_ptr &processingBuffer, + size_t startOffset, + size_t offsetLength, + float playbackRate) final; + private: // User provided buffers std::list>> buffers_{}; @@ -67,18 +77,6 @@ class AudioBufferQueueSourceNode : public AudioBufferBaseSourceNode { double playedBuffersDuration_ = 0; uint64_t onBufferEndedCallbackId_ = 0; // 0 means no callback - - void processWithoutInterpolation( - const std::shared_ptr &processingBuffer, - size_t startOffset, - size_t offsetLength, - float playbackRate) override; - - void processWithInterpolation( - const std::shared_ptr &processingBuffer, - size_t startOffset, - size_t offsetLength, - float playbackRate) override; }; } // namespace audioapi diff --git a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp index e5bf7ec4a..a67a88220 100644 --- a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +++ b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp @@ -47,7 +47,6 @@ void AudioBufferSourceNode::setLoopEnd(double loopEnd) { void AudioBufferSourceNode::setBuffer( const std::shared_ptr &buffer, - const std::shared_ptr &playbackRateBuffer, const std::shared_ptr &audioBuffer) { std::shared_ptr context = context_.lock(); @@ -68,12 +67,10 @@ void AudioBufferSourceNode::setBuffer( channelCount_ = 1; buffer_ = nullptr; - playbackRateBuffer_ = nullptr; return; } buffer_ = buffer; - playbackRateBuffer_ = playbackRateBuffer; audioBuffer_ = audioBuffer; channelCount_ = buffer_->getNumberOfChannels(); loopEnd_ = buffer_->getDuration(); @@ -111,26 +108,6 @@ void AudioBufferSourceNode::unregisterOnLoopEndedCallback(uint64_t callbackId) { audioEventHandlerRegistry_->unregisterHandler(AudioEvent::LOOP_ENDED, callbackId); } -std::shared_ptr AudioBufferSourceNode::processNode( - const std::shared_ptr &processingBuffer, - int framesToProcess) { - // No audio data to fill, zero the output and return. - if (buffer_ == nullptr) { - processingBuffer->zero(); - return processingBuffer; - } - - if (!pitchCorrection_) { - processWithoutPitchCorrection(processingBuffer, framesToProcess); - } else { - processWithPitchCorrection(processingBuffer, framesToProcess); - } - - handleStopScheduled(); - - return processingBuffer; -} - double AudioBufferSourceNode::getCurrentPosition() const { return dsp::sampleFrameToTime(static_cast(vReadIndex_), buffer_->getSampleRate()); } @@ -146,6 +123,10 @@ void AudioBufferSourceNode::sendOnLoopEndedEvent() { * Helper functions */ +bool AudioBufferSourceNode::isEmpty() const { + return buffer_ == nullptr; +} + void AudioBufferSourceNode::processWithoutInterpolation( const std::shared_ptr &processingBuffer, size_t startOffset, diff --git a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h index 29f775e1e..af8bd4812 100644 --- a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +++ b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h @@ -33,7 +33,6 @@ class AudioBufferSourceNode : public AudioBufferBaseSourceNode { /// @note Audio Thread only void setBuffer( const std::shared_ptr &buffer, - const std::shared_ptr &playbackRateBuffer, const std::shared_ptr &audioBuffer); using AudioScheduledSourceNode::start; @@ -49,10 +48,21 @@ class AudioBufferSourceNode : public AudioBufferBaseSourceNode { void unregisterOnLoopEndedCallback(uint64_t callbackId); protected: - std::shared_ptr processNode( + double getCurrentPosition() const final; + + bool isEmpty() const final; + + void processWithoutInterpolation( + const std::shared_ptr &processingBuffer, + size_t startOffset, + size_t offsetLength, + float playbackRate) final; + + void processWithInterpolation( const std::shared_ptr &processingBuffer, - int framesToProcess) override; - double getCurrentPosition() const override; + size_t startOffset, + size_t offsetLength, + float playbackRate) final; private: // Looping related properties @@ -67,18 +77,6 @@ class AudioBufferSourceNode : public AudioBufferBaseSourceNode { uint64_t onLoopEndedCallbackId_ = 0; // 0 means no callback void sendOnLoopEndedEvent(); - void processWithoutInterpolation( - const std::shared_ptr &processingBuffer, - size_t startOffset, - size_t offsetLength, - float playbackRate) override; - - void processWithInterpolation( - const std::shared_ptr &processingBuffer, - size_t startOffset, - size_t offsetLength, - float playbackRate) override; - double getVirtualStartFrame(float sampleRate) const; double getVirtualEndFrame(float sampleRate); }; diff --git a/packages/react-native-audio-api/common/cpp/audioapi/types/NodeOptions.h b/packages/react-native-audio-api/common/cpp/audioapi/types/NodeOptions.h index b2df4a479..c69304d6d 100644 --- a/packages/react-native-audio-api/common/cpp/audioapi/types/NodeOptions.h +++ b/packages/react-native-audio-api/common/cpp/audioapi/types/NodeOptions.h @@ -96,6 +96,7 @@ struct BaseAudioBufferSourceOptions : AudioScheduledSourceNodeOptions { bool pitchCorrection = false; float detune = 0.0f; float playbackRate = 1.0f; + int onPositionChangedInterval = 100; }; struct AudioBufferSourceOptions : BaseAudioBufferSourceOptions { From b3646e2fdb11bfb1009055beec59dc2c3ed05b8b Mon Sep 17 00:00:00 2001 From: maciejmakowski2003 Date: Thu, 12 Mar 2026 14:17:05 +0100 Subject: [PATCH 2/2] ci: yarn format --- .../sources/AudioBufferBaseSourceNodeHostObject.cpp | 4 +++- .../cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp b/packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp index 0be7026d1..8f54eac8a 100644 --- a/packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +++ b/packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp @@ -13,7 +13,9 @@ namespace audioapi { AudioBufferBaseSourceNodeHostObject::AudioBufferBaseSourceNodeHostObject( const std::shared_ptr &node, const BaseAudioBufferSourceOptions &options) - : AudioScheduledSourceNodeHostObject(node, options), onPositionChangedInterval_(options.onPositionChangedInterval), pitchCorrection_(options.pitchCorrection) { + : AudioScheduledSourceNodeHostObject(node, options), + onPositionChangedInterval_(options.onPositionChangedInterval), + pitchCorrection_(options.pitchCorrection) { auto sourceNode = std::static_pointer_cast(node_); detuneParam_ = std::make_shared(sourceNode->getDetuneParam()); playbackRateParam_ = std::make_shared(sourceNode->getPlaybackRateParam()); diff --git a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp index 14ee814f5..33852741c 100644 --- a/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +++ b/packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp @@ -81,7 +81,8 @@ std::shared_ptr AudioBufferBaseSourceNode::processNode( } void AudioBufferBaseSourceNode::sendOnPositionChangedEvent() { - if (onPositionChangedCallbackId_ != 0 && onPositionChangedTimeInFrames_ > onPositionChangedIntervalInFrames_) { + if (onPositionChangedCallbackId_ != 0 && + onPositionChangedTimeInFrames_ > onPositionChangedIntervalInFrames_) { std::unordered_map body = {{"value", getCurrentPosition()}}; audioEventHandlerRegistry_->invokeHandlerWithEventBody(