diff options
Diffstat (limited to 'src/audio/fatfs_audio_input.cpp')
| -rw-r--r-- | src/audio/fatfs_audio_input.cpp | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/src/audio/fatfs_audio_input.cpp b/src/audio/fatfs_audio_input.cpp index 4c5e981b..b919a3a8 100644 --- a/src/audio/fatfs_audio_input.cpp +++ b/src/audio/fatfs_audio_input.cpp @@ -47,12 +47,10 @@ FatfsAudioInput::FatfsAudioInput(database::ITagParser& tag_parser) tag_parser_(tag_parser), new_stream_mutex_(), new_stream_(), - has_new_stream_(xSemaphoreCreateBinary()), + has_new_stream_(false), pending_path_() {} -FatfsAudioInput::~FatfsAudioInput() { - vSemaphoreDelete(has_new_stream_); -} +FatfsAudioInput::~FatfsAudioInput() {} auto FatfsAudioInput::SetPath(std::future<std::optional<std::pmr::string>> fut) -> void { @@ -61,36 +59,40 @@ auto FatfsAudioInput::SetPath(std::future<std::optional<std::pmr::string>> fut) new database::FutureFetcher<std::optional<std::pmr::string>>( std::move(fut))); - xSemaphoreGive(has_new_stream_); + has_new_stream_ = true; + has_new_stream_.notify_one(); } auto FatfsAudioInput::SetPath(const std::pmr::string& path) -> void { std::lock_guard<std::mutex> guard{new_stream_mutex_}; if (OpenFile(path)) { - xSemaphoreGive(has_new_stream_); + has_new_stream_ = true; + has_new_stream_.notify_one(); } } auto FatfsAudioInput::SetPath() -> void { std::lock_guard<std::mutex> guard{new_stream_mutex_}; new_stream_.reset(); - xSemaphoreGive(has_new_stream_); + has_new_stream_ = true; + has_new_stream_.notify_one(); } auto FatfsAudioInput::HasNewStream() -> bool { - bool res = xSemaphoreTake(has_new_stream_, 0); - if (res) { - xSemaphoreGive(has_new_stream_); - } - return res; + return has_new_stream_; } auto FatfsAudioInput::NextStream() -> std::shared_ptr<codecs::IStream> { while (true) { - xSemaphoreTake(has_new_stream_, portMAX_DELAY); + has_new_stream_.wait(false); { std::lock_guard<std::mutex> guard{new_stream_mutex_}; + if (!has_new_stream_.exchange(false)) { + // If the new stream went away, then we need to go back to waiting. + continue; + } + // If the path is a future, then wait for it to complete. if (pending_path_) { auto res = pending_path_->Result(); |
