Skip to content

Commit d7881c5

Browse files
authored
Remove unmuteAfterDequeue flag (#716)
1 parent 1abbf6d commit d7881c5

File tree

2 files changed

+58
-58
lines changed

2 files changed

+58
-58
lines changed

Sources/CSFBAudioEngine/Player/AudioPlayer.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -248,16 +248,14 @@ class AudioPlayer final {
248248
enum class Flags : unsigned int {
249249
/// Cached value of `engine_.isRunning`
250250
engineIsRunning = 1u << 0,
251-
/// The render block is outputting audio
251+
/// The render block should output audio
252252
isPlaying = 1u << 1,
253-
/// The render block is outputting silence
253+
/// The render block should output silence
254254
isMuted = 1u << 2,
255255
/// The ring buffer needs to be drained during the next render cycle
256256
drainRequired = 1u << 3,
257-
/// The decoding thread should unmute after the next decoder is dequeued and becomes active
258-
unmuteAfterDequeue = 1u << 4,
259257
/// Mismatch between rendering format and decoder processing format
260-
formatMismatch = 1u << 5,
258+
formatMismatch = 1u << 4,
261259
};
262260

263261
// MARK: - Decoding

Sources/CSFBAudioEngine/Player/AudioPlayer.mm

Lines changed: 55 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)