@@ -474,7 +474,7 @@ bool PerformSeek() noexcept
474474 if (forImmediatePlayback) {
475475 CancelActiveDecoders ();
476476 // Mute until the decoder becomes active
477- flags_.fetch_or (static_cast <unsigned int >(Flags::isMuted) | static_cast < unsigned int >(Flags::unmuteAfterDequeue) , std::memory_order_acq_rel);
477+ flags_.fetch_or (static_cast <unsigned int >(Flags::isMuted), std::memory_order_acq_rel);
478478 }
479479
480480 dispatch_semaphore_signal (decodingSemaphore_);
@@ -1144,67 +1144,69 @@ bool PerformSeek() noexcept
11441144 }
11451145 }
11461146
1147- if (decoderState && !(flags_.load (std::memory_order_acquire) & static_cast <unsigned int >(Flags::drainRequired))) {
1148- // Decode and write chunks to the ring buffer
1149- while (audioRingBuffer_.FreeSpace () >= ringBufferChunkSize) {
1150- // Decoding started
1151- if (const auto flags = decoderState->flags_ .load (std::memory_order_acquire); !(flags & static_cast <unsigned int >(DecoderState::Flags::decodingStarted))) {
1152- const bool suspended = flags & static_cast <unsigned int >(DecoderState::Flags::decodingSuspended);
1153-
1154- if (!suspended)
1155- os_log_debug (log_, " Decoding starting for %{public}@" , decoderState->decoder_ );
1156- else
1157- os_log_debug (log_, " Decoding starting after suspension for %{public}@" , decoderState->decoder_ );
1158-
1159- decoderState->flags_ .fetch_or (static_cast <unsigned int >(DecoderState::Flags::decodingStarted), std::memory_order_acq_rel);
1160-
1161- // Submit the decoding started event for the initial start only
1162- if (!suspended) {
1163- const DecodingEventHeader header{DecodingEventCommand::started};
1164- if (decodingEvents_.WriteValues (header, decoderState->sequenceNumber_ ))
1165- dispatch_semaphore_signal (eventSemaphore_);
1147+ if (decoderState) {
1148+ if (const auto flags = flags_.load (std::memory_order_acquire); !(flags & static_cast <unsigned int >(Flags::drainRequired))) {
1149+ // Decode and write chunks to the ring buffer
1150+ while (audioRingBuffer_.FreeSpace () >= ringBufferChunkSize) {
1151+ // Decoding started
1152+ if (const auto flags = decoderState->flags_ .load (std::memory_order_acquire); !(flags & static_cast <unsigned int >(DecoderState::Flags::decodingStarted))) {
1153+ const bool suspended = flags & static_cast <unsigned int >(DecoderState::Flags::decodingSuspended);
1154+
1155+ if (!suspended)
1156+ os_log_debug (log_, " Decoding starting for %{public}@" , decoderState->decoder_ );
11661157 else
1167- os_log_fault (log_, " Error writing decoding started event" );
1168- }
1169- }
1170-
1171- // Decode audio into the buffer, converting to the rendering format in the process
1172- if (NSError *error = nil ; !decoderState->DecodeAudio (buffer, &error)) {
1173- os_log_error (log_, " Error decoding audio: %{public}@" , error);
1174- if (error)
1175- SubmitDecodingErrorEvent (error);
1176- }
1158+ os_log_debug (log_, " Decoding starting after suspension for %{public}@" , decoderState->decoder_ );
11771159
1178- // Write the decoded audio to the ring buffer for rendering
1179- const auto framesWritten = audioRingBuffer_.Write (buffer.audioBufferList , buffer.frameLength );
1180- if (framesWritten != buffer.frameLength )
1181- os_log_fault (log_, " Error writing audio to ring buffer: CXXCoreAudio::AudioRingBuffer::Write failed for %d frames" , buffer.frameLength );
1160+ decoderState->flags_ .fetch_or (static_cast <unsigned int >(DecoderState::Flags::decodingStarted), std::memory_order_acq_rel);
11821161
1183- // Decoding complete
1184- if (const auto flags = decoderState->flags_ .load (std::memory_order_acquire); flags & static_cast <unsigned int >(DecoderState::Flags::decodingComplete)) {
1185- const bool resumed = flags & static_cast <unsigned int >(DecoderState::Flags::decodingResumed);
1162+ // Submit the decoding started event for the initial start only
1163+ if (!suspended) {
1164+ const DecodingEventHeader header{DecodingEventCommand::started};
1165+ if (decodingEvents_.WriteValues (header, decoderState->sequenceNumber_ ))
1166+ dispatch_semaphore_signal (eventSemaphore_);
1167+ else
1168+ os_log_fault (log_, " Error writing decoding started event" );
1169+ }
1170+ }
11861171
1187- // Submit the decoding complete event for the first completion only
1188- if (!resumed) {
1189- const DecodingEventHeader header{DecodingEventCommand::complete};
1190- if (decodingEvents_.WriteValues (header, decoderState->sequenceNumber_ ))
1191- dispatch_semaphore_signal (eventSemaphore_);
1192- else
1193- os_log_fault (log_, " Error writing decoding complete event" );
1172+ // Decode audio into the buffer, converting to the rendering format in the process
1173+ if (NSError *error = nil ; !decoderState->DecodeAudio (buffer, &error)) {
1174+ os_log_error (log_, " Error decoding audio: %{public}@" , error);
1175+ if (error)
1176+ SubmitDecodingErrorEvent (error);
11941177 }
11951178
1196- if (!resumed)
1197- os_log_debug (log_, " Decoding complete for %{public}@" , decoderState->decoder_ );
1198- else
1199- os_log_debug (log_, " Decoding complete after resuming for %{public}@" , decoderState->decoder_ );
1179+ // Write the decoded audio to the ring buffer for rendering
1180+ const auto framesWritten = audioRingBuffer_.Write (buffer.audioBufferList , buffer.frameLength );
1181+ if (framesWritten != buffer.frameLength )
1182+ os_log_fault (log_, " Error writing audio to ring buffer: CXXCoreAudio::AudioRingBuffer::Write failed for %d frames" , buffer.frameLength );
1183+
1184+ // Decoding complete
1185+ if (const auto flags = decoderState->flags_ .load (std::memory_order_acquire); flags & static_cast <unsigned int >(DecoderState::Flags::decodingComplete)) {
1186+ const bool resumed = flags & static_cast <unsigned int >(DecoderState::Flags::decodingResumed);
1187+
1188+ // Submit the decoding complete event for the first completion only
1189+ if (!resumed) {
1190+ const DecodingEventHeader header{DecodingEventCommand::complete};
1191+ if (decodingEvents_.WriteValues (header, decoderState->sequenceNumber_ ))
1192+ dispatch_semaphore_signal (eventSemaphore_);
1193+ else
1194+ os_log_fault (log_, " Error writing decoding complete event" );
1195+ }
1196+
1197+ if (!resumed)
1198+ os_log_debug (log_, " Decoding complete for %{public}@" , decoderState->decoder_ );
1199+ else
1200+ os_log_debug (log_, " Decoding complete after resuming for %{public}@" , decoderState->decoder_ );
12001201
1201- break ;
1202+ break ;
1203+ }
12021204 }
1203- }
12041205
1205- // Clear the mute flags if needed
1206- if (flags_.load (std::memory_order_acquire) & static_cast <unsigned int >(Flags::unmuteAfterDequeue))
1207- flags_.fetch_and (~static_cast <unsigned int >(Flags::isMuted) & ~static_cast <unsigned int >(Flags::unmuteAfterDequeue), std::memory_order_acq_rel);
1206+ // Clear the mute flag if needed now that the ring buffer is full
1207+ if (flags & static_cast <unsigned int >(Flags::isMuted))
1208+ flags_.fetch_and (~static_cast <unsigned int >(Flags::isMuted), std::memory_order_acq_rel);
1209+ }
12081210 }
12091211
12101212 int64_t deltaNanos;
0 commit comments