mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-01-16 18:11:02 -05:00
* Fix of the issue that 'File has been deleted' popup would show in Relaxation app at the end of playback if the playback was paused at least once, even though the file wasn't actually deleted. * Added very basic audio decoder error handling and propagation mechanism. * Minor refactor around several audio-related parts.
73 lines
2.3 KiB
C++
73 lines
2.3 KiB
C++
// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved.
|
|
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
|
|
|
|
#pragma once
|
|
|
|
#include <Audio/StreamQueuedEventsListener.hpp>
|
|
#include <Audio/AbstractStream.hpp>
|
|
|
|
#include <Service/Worker.hpp>
|
|
#include <semaphore.hpp>
|
|
|
|
namespace audio
|
|
{
|
|
class Decoder;
|
|
class DecoderWorker : public sys::Worker
|
|
{
|
|
public:
|
|
using EndOfFileCallback = std::function<void()>;
|
|
using FileDeletedCallback = std::function<void()>;
|
|
|
|
enum class Command
|
|
{
|
|
EnablePlayback,
|
|
DisablePlayback,
|
|
};
|
|
|
|
enum class ChannelMode
|
|
{
|
|
NoConversion,
|
|
ForceStereo
|
|
};
|
|
|
|
DecoderWorker(AbstractStream *audioStreamOut,
|
|
Decoder *decoder,
|
|
const EndOfFileCallback &endOfFileCallback,
|
|
const FileDeletedCallback &fileDeletedCallback,
|
|
ChannelMode mode);
|
|
~DecoderWorker() override;
|
|
|
|
virtual auto init(std::list<sys::WorkerQueueInfo> queues = std::list<sys::WorkerQueueInfo>()) -> bool override;
|
|
|
|
auto enablePlayback() -> bool;
|
|
auto disablePlayback() -> bool;
|
|
|
|
private:
|
|
static constexpr std::size_t stackDepth = 12 * 1024;
|
|
|
|
virtual auto handleMessage(std::uint32_t queueID) -> bool override;
|
|
void pushAudioData();
|
|
bool stateChangeWait();
|
|
|
|
using BufferInternalType = std::int16_t;
|
|
|
|
static constexpr auto workerName = "DecoderWorker";
|
|
static constexpr auto workerPriority = static_cast<UBaseType_t>(sys::ServicePriority::Idle);
|
|
static constexpr auto listenerQueueName = "DecoderWorkerQueue";
|
|
static constexpr auto listenerQueueCapacity = 1024;
|
|
|
|
AbstractStream *audioStreamOut = nullptr;
|
|
Decoder *decoder = nullptr;
|
|
std::unique_ptr<StreamQueuedEventsListener> queueListener;
|
|
bool playbackEnabled = false;
|
|
cpp_freertos::BinarySemaphore stateSemaphore;
|
|
|
|
const int bufferSize;
|
|
std::unique_ptr<BufferInternalType[]> decoderBuffer;
|
|
ChannelMode channelMode = ChannelMode::NoConversion;
|
|
|
|
EndOfFileCallback endOfFileCallback;
|
|
FileDeletedCallback fileDeletedCallback;
|
|
};
|
|
} // namespace audio
|