parent
e8f5e73b1a
commit
c1f7adf227
@ -0,0 +1,41 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2023 jacqueline <me@jacqueline.id.au> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-3.0-only |
||||||
|
*/ |
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <cstddef> |
||||||
|
#include <cstdint> |
||||||
|
#include <optional> |
||||||
|
#include <span> |
||||||
|
#include <string> |
||||||
|
#include <utility> |
||||||
|
|
||||||
|
#include "mad.h" |
||||||
|
#include "sample.hpp" |
||||||
|
#include "source_buffer.hpp" |
||||||
|
|
||||||
|
#include "codec.hpp" |
||||||
|
|
||||||
|
namespace codecs { |
||||||
|
|
||||||
|
class NativeDecoder : public ICodec { |
||||||
|
public: |
||||||
|
NativeDecoder(); |
||||||
|
|
||||||
|
auto OpenStream(std::shared_ptr<IStream> input, uint32_t offset) |
||||||
|
-> cpp::result<OutputFormat, Error> override; |
||||||
|
|
||||||
|
auto DecodeTo(std::span<sample::Sample> destination) |
||||||
|
-> cpp::result<OutputInfo, Error> override; |
||||||
|
|
||||||
|
NativeDecoder(const NativeDecoder&) = delete; |
||||||
|
NativeDecoder& operator=(const NativeDecoder&) = delete; |
||||||
|
|
||||||
|
private: |
||||||
|
std::shared_ptr<IStream> input_; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace codecs
|
@ -0,0 +1,48 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2023 jacqueline <me@jacqueline.id.au> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-3.0-only |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "native.hpp" |
||||||
|
|
||||||
|
#include <cstdint> |
||||||
|
#include <cstring> |
||||||
|
#include <optional> |
||||||
|
|
||||||
|
#include "esp_heap_caps.h" |
||||||
|
#include "mad.h" |
||||||
|
|
||||||
|
#include "codec.hpp" |
||||||
|
#include "esp_log.h" |
||||||
|
#include "result.hpp" |
||||||
|
#include "sample.hpp" |
||||||
|
#include "types.hpp" |
||||||
|
|
||||||
|
namespace codecs { |
||||||
|
|
||||||
|
NativeDecoder::NativeDecoder() : input_() {} |
||||||
|
|
||||||
|
auto NativeDecoder::OpenStream(std::shared_ptr<IStream> input, uint32_t offset) |
||||||
|
-> cpp::result<OutputFormat, ICodec::Error> { |
||||||
|
input_ = input; |
||||||
|
return OutputFormat{ |
||||||
|
.num_channels = 1, |
||||||
|
.sample_rate_hz = 48000, |
||||||
|
.total_samples = {}, |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
auto NativeDecoder::DecodeTo(std::span<sample::Sample> output) |
||||||
|
-> cpp::result<OutputInfo, Error> { |
||||||
|
size_t bytes = input_->Read({ |
||||||
|
reinterpret_cast<std::byte*>(output.data()), |
||||||
|
output.size_bytes(), |
||||||
|
}); |
||||||
|
return OutputInfo{ |
||||||
|
.samples_written = bytes / sizeof(sample::Sample), |
||||||
|
.is_stream_finished = false, |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace codecs
|
Loading…
Reference in new issue