Files
MuditaOS/module-audio/Audio/Endpoint.cpp
Marcin Smoczyński 8b21df135c [EGD-5742] Add audio format checking
Check if decoder's file format is supported by the sink audio device
before playing the sound. Add list of supported formats to each of audio
devices.

Signed-off-by: Marcin Smoczyński <smoczynski.marcin@gmail.com>
2021-04-12 10:00:00 +02:00

126 lines
2.3 KiB
C++

// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "Endpoint.hpp"
#include <algorithm>
#include <vector>
#include <cassert> // assert
using namespace audio;
Endpoint::Endpoint(const Capabilities &caps) : _caps(caps)
{}
const Endpoint::Capabilities &Endpoint::getCapabilities() const noexcept
{
return _caps;
}
void Endpoint::connectStream(Stream &stream)
{
assert(_stream == nullptr);
_stream = &stream;
}
void Endpoint::disconnectStream()
{
assert(_stream != nullptr);
_stream = nullptr;
}
bool Endpoint::isConnected() const noexcept
{
return _stream != nullptr;
}
auto Endpoint::isFormatSupported(const AudioFormat &format) -> bool
{
const auto &formats = getSupportedFormats();
return std::find(std::begin(formats), std::end(formats), format) != std::end(formats);
}
Sink::Sink(const Capabilities &caps) : Endpoint(caps)
{}
Source::Source(const Capabilities &caps) : Endpoint(caps)
{}
IOProxy::IOProxy(const Capabilities &sourceCaps, const Capabilities &sinkCaps) : Source(sourceCaps), Sink(sinkCaps)
{}
StreamConnection::StreamConnection(Source *source, Sink *sink, Stream *stream)
: _sink(sink), _source(source), _stream(stream)
{
assert(_sink != nullptr);
assert(_source != nullptr);
assert(_stream != nullptr);
_sink->connectStream(*_stream);
_source->connectStream(*_stream);
}
StreamConnection::~StreamConnection()
{
destroy();
}
void StreamConnection::destroy()
{
disable();
_sink->disconnectStream();
_source->disconnectStream();
}
void StreamConnection::enable()
{
if (enabled) {
return;
}
_stream->reset();
_sink->enableOutput();
_source->enableInput();
enabled = true;
}
void StreamConnection::disable()
{
if (!enabled) {
return;
}
_source->disableInput();
_sink->disableOutput();
_stream->reset();
enabled = false;
}
bool StreamConnection::isEnabled() const noexcept
{
return enabled;
}
Source *StreamConnection::getSource() const noexcept
{
return _source;
}
Sink *StreamConnection::getSink() const noexcept
{
return _sink;
}
Stream *StreamConnection::getStream() const noexcept
{
return _stream;
}
auto Source::getSourceFormat() -> AudioFormat
{
return audio::nullFormat;
}